📄 汇编代码.txt
字号:
mov dx,dat2 ;DX放高位字有符号数
or dx,dx ;产生标志位
jns next ;若为正数转next
not ax ;若为负数则低位字求反
not dx ;并且高位字求反
add ax,1 ;低位字加1
adc dx,0 ;若有进位则高位字再加1
next: mov abs1,ax ;abs1放低位字绝对值
mov abs2,dx ;abs2放高位字绝对值
2、在附加数据段中有一首址为ADDR的没有排序字数组,数据的第一个字为数组长度,第二个字开始存放数组各元素。在KEY单元存放一要删除的字数据。要求编一完整程序,在数组中查找该数,如果找到该数,将其从数组中删除,并修改数组长度。
data segment
addr dw 8,1275h,4652h,0034h,4cbah,1ff0h,563bh,5312h,89abh
key dw 0034h
data ends
code segment
assume cs:code, ds:data, es:data
find proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax
lea di,addr
push di
mov ax,key
mov cx,es:[di]
add di,2
cld
repnz scasw
jz delete
pop di
jmp exit
delete: jcxz next
del: mov bx es:[di]
mov es:[di-2],bx
add di,2
loop del
next: pop di
dec word ptr es:[di]
exit: ret
find endp
main: call find
code ends
end main
模拟试卷4
1、试编写一程序段,在CHAR为首址的26个字节单元中依次存放字母'A'~'Z'。
char db 26 dup(?)
...
start:lea bx,char
mov al,'A'
mov cx,26
lop1: mov [bx],al
inc al
inc bx
loop lop1
... 2、以BUF为首址的存储区,存放有若干个有符号字数据,试编写一程序求出其中负数的平均值(负数之和>-32768),并存放在MEA2单元中。
data segment
buf dw ...
count equ $-buf
mea2 dw ?
data ends
code segment
assume cs:code, ds:data
navl proc near
start: push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
lea si,buf
mov cx,count
shr cx,1
xor dx,dx
mov di,dx
again: mov bx,[si]
cmp bx,0
jge next
add ax,bx
inc di
next: inc si
loop again
mov bx,di
cwd
idiv bx
mov mea2,ax
ret
nval endp
main
......
code ends
end main
3.5 编写完整程序,把从键盘读入的一个小写字母转换成相应的大写母,并输出。
[解法1]
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,al ;暂存到bl中
sub bl,32 ;小写字母转成大写字母
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出大写字母
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
[解法2]
data segment
buf1 db "Input a upper char:",'$'
buf2 db 13,10,"not a lower char!",13,10,'$'
data ends
code segment
assume cs:code
main: mov ax,data ;输出提示buf1
mov ds,ax
lea dx,buf1
mov ah,9
int 21h
mov ah,1 ;输入字符并暂存到bl中
int 21h
mov bl,al
cmp bl,'a'
jb lab1
cmp bl,'z'
ja lab1
sub bl,32 ;小写字母转成大写字母
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出大写字母
int 21h
jmp lab
lab1: mov ah,9 ;输出输入字符非小写字母的提示
lea dx,buf2
int 21h
lab: mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
3.6 编写程序,从键盘读入一个符号,如果它的ASCII值是偶数则输出0,是奇数则输出1。[提示:输出除以2的余数]
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov ah,0 ;准备被除数ax
mov bl,2 ;准备除数bl
div bl ;ax除bl,余数在ah中
add ah,30h ;转换成字符对应的ascii码
mov bl,ah ;暂存到bl中
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出该字符
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
3.7 从键盘读入一个小写字母,输出字母表中倒数与该字母序号相同的那个字母。例如输入首字母a,则输出最后一个字母z,输入第4个字母d则输出倒数第4个字母w。
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,'z' ;求对应的字母并暂存到bl
sub bl,al
add bl,'a'
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出该字符
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
3.8 编写一个程序段,把AL中的高4位与低4位交换位置。
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,10h
mul bl ;al*10h的积在ax中(ah为高位转为低位,al为低位转为高位。)
add al,ah
mov bl,al ;将结果暂存到bl中
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出结果
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
4.9 编写完整程序,用十六进制输出一个按键的ASCII值,要求输出形式是:A=41H
[解法1]
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,al ;暂存到bl中
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出该字符和等号
int 21h
mov dl,'='
int 21h
mov ah,0 ;将该字符的ascii码送入ax
mov al,bl
mov bl,10h ;准备除数bl=16
div bl ;相除后al为商,ah为余数
mov bx,ax ;暂存到bx中(bl为商,bh为余数)
mov si,1 ;si为计数器
mov dl,bl ;利用dl计算,再进行输出
jmp lab3
lab4: mov dl,bh ;第2次输出余数时送bh
lab3: cmp dl,9 ;除16后,可能小于等于9,或大于9
ja lab2
add dl,30h ;小于9加30h转成数字字符的ascii码
jmp lab1
lab2: sub dl,10 ;大于9转成字母的ascii码
add dl,'A'
lab1: mov ah,2 ;输出字符
int 21h
inc si ;计数器加1
cmp si,2
jbe lab4 ;比较后若小于等于2跳转,准备余数的计算和输出
mov dl,'H' ;输出字符H
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
[解法2]
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,al ;暂存到bl中
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov dl,bl ;输出该字符和等号
int 21h
mov dl,'='
int 21h
mov si,1 ;si为计数器
lab3: mov al,bl ;准备被乘数al
mov bl,10h ;准备乘数bl=16
mul bl ;相乘的积在ax中
mov bl,al ;低位al暂存到bl中,后续程序输出高位ah
mov dl,ah ;利用dl计算,再进行输出
cmp dl,9 ;乘以16后,高位可能小于等于9,或大于9
ja lab2
add dl,30h ;小于9加30h转成数字字符的ascii码
jmp lab1
lab2: sub dl,10 ;大于9转成字母的ascii码
add dl,'A'
lab1: mov ah,2 ;输出字符
int 21h
inc si ;计数器加1
cmp si,2
jbe lab3 ;比较后若小于等于2跳转,准备下一位的输出
mov dl,'H' ;输出字符H
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
4.10 编写完整程序,用二进制输出一个按键的ASCII值。
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,al ;暂存到bl中
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
mov cx,8 ;设置循环计数器
lab1: mov al,bl ;准备被乘数al
mov bl,2 ;准备乘数bl=2
mul bl ;相乘的积在ax中
mov bl,al ;低位al暂存到bl中,因为输出功能影响al
mov dl,ah ;将高位ah输出
add dl,30h
mov ah,2
int 21h
loop lab1 ;循环
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
4.11 编写完整程序,判断一个按键是不是回车键。
[解法1]
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,al ;输入字符暂存到bl中
mov ah,2 ;输出回车换行
mov dl,13
int 21h
mov dl,10
int 21h
cmp bl,13 ;比较是否为回车键
jz lab1
mov dl,'n'
jmp lab2
lab1: mov dl,'y'
lab2: mov ah,2
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
[解法2]
data segment
buf1 db 'Input:','$'
buf2 db 'Not <Enter>','$'
buf3 db 'It is <Enter>','$'
data ends
code segment
assume cs:code,ds:data
main: mov ax,data ;利用9号功能输出提示
mov ds,ax
lea dx,buf1
mov ah,9
int 21h
mov ah,1 ;利用1号功能输入1个字符,并暂存到bl中
int 21h
mov bl,al
mov ah,2 ;输出回车换行
mov dl,13
int 21h
mov dl,10
int 21h
cmp bl,13 ;比较是否为回车键
jz lab1
lea dx,buf2
jmp lab2
lab1: lea dx,buf3
lab2: mov ah,9
int 21h
mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
4.12 编写完整程序,输入一个字母,输出该字母在英文字母表中的顺序号,若输入的不是字母则输出“*”。注意输入的字母既可以是大定也可以是小写。
code segment
assume cs:code
main: mov ah,1
int 21h ;输入字符到al
mov bl,al ;暂存
mov ah,2 ;回车换行
mov dl,13
int 21h
mov dl,10
int 21h
cmp bl,'A' ;和'A'比较
jl lab1 ;小于'A'跳转lab1输出'*',大于等于'A'继续比较
cmp bl,'Z' ;和'Z'比较
jle lab2 ;小于等于'Z'表明为大写字母,跳转lab2求序号
cmp bl,'a' ;和'a'比较
jl lab1 ;小于'a'跳转lab1输出'*',大于等于'a'继续比较
cmp bl,'z' ;和'z'比较
jg lab1 ;大于'z'跳转lab1输出'*',小于等于'z'表明为小写字母
sub bl,'a'-1 ;计算小写字母的顺序号
jmp lab3
lab2: sub bl,'A'-1 ;计算大写字母的顺序号
lab3: mov ah,0 ;准备被除数ax
mov al,bl
mov bl,10 ;准备除数bl
div bl ;十位在al中,个位在ah中
mov bx,ax ;将结果暂存到bx中
add bx,3030h
mov ah,2
cmp bl,'0' ;若十位为'0',不输出
jz lab5
mov dl,bl ;输出十位
int 21h
lab5: mov dl,bh ;输出个位
int 21h
jmp lab4
lab1: mov ah,2 ;输出'*'号
mov dl,'*'
mov al,2
int 21h
lab4: mov ah,4ch ;控制权交还DOS
int 21h
code ends
end main
4.13 编写完整程序,把键盘输入的三个按键按ASCII值由小到大的次序输出。
code segment
assume cs:code
main: mov ah,1 ;输入三个字符分别放在cl,bl,al中
int 21h
mov cl,al
int 21h
mov bl,al
int 21h
cmp al,bl ;若al小于bl交换
jl lab1
xchg al,bl
lab1: cmp bl,cl ;若bl小于cl交换
jl lab2
xchg bl,cl
lab2: cmp al,bl ;若al小于bl交换(注意:请考虑为何不比较al和cl)
jl lab3
xchg al,bl
lab3: mov bh,al ;暂存al到bh中
mov ah,2 ;回车换行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -