1、试编写一个汇编程序,能对键盘输入的小写字母用大写字母显示出来(要求采用子程序格式,即采用子程序完成将小写字母转化成大写字母)。
DATA SEGMENT
arr dw 1,3,2,4,2,7,9,34,6
num equ $-arr
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
big proc near
sub al,20h
ret
big endp
START:MOV AX,DATA
MOV DS,AX
mov ah,1
int 21h
call big
mov dl,al
mov ah,2
int 21h
exit:
mov ah,4ch
int 21h
CODE ENDS
END START
2、有2个数组:
ary1 db 12,-35,0,126,-90,-5,68,120,1,-19
ary2 db 24,25,0,-38,-89,99,68,100,2,-20
比较两个数组的对应位,将大的数放在ary1数组中,小的数放在ary2中(要求采用子程序格式)
DATA SEGMENT
ary1 db 12,-35,0,126,-90,-5,68,120,1,-19
ary2 db 24,25,0,-38,-89,99,68,100,2,-20
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
comp proc near
cmp al,bl
jg next
xchg al,bl
next:
ret
comp endp
START:MOV AX,DATA
MOV DS,AX
lea di,ary1
lea si,ary2
mov cx,ary2-ary1
loop1:
mov al,[di]
mov bl,[si]
call comp
mov [di],al
mov [si],bl
add di,2
add si,2
loop loop1
exit:
mov ah,4ch
int 21h
CODE ENDS
END START
3、用DOS的10号功能调用输入一个字符串,并用DOS的9号功能调用将这个字符串输出到屏幕上显示
DATA SEGMENT
str db 20
len db ?
buf db 50 dup (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
lea dx,str
mov ah,10
int 21h
mov dl,0ah
mov ah,02h
int 21h
mov dx,offset buf
mov cl,len
mov ch,0
mov bx,dx
add bx,cx
mov byte ptr[bx],'$'
mov ah,9
int 21h
exit:
mov ax,4c00h
int 21h
CODE ENDS
END START
4、最大和最小数实验
以buff开始的内存单元中有10个有符号数(字节型DB):
-37、28、-115、-2、98、-100、93、120、56、-99
请编写程序,找出最大的数并存入MAX单元中,同时也找出最小的数并存入MIN单元中,在Debug下运行程序,查看数据区MAX和MIN的内容检验运行结果。
DATA SEGMENT
buf db -37,28,-115,-2,98,-100,93,120,56,-99
len equ $-buf
max db ?
min db ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
mov cx,len
mov si,0
mov bl,200
mov dl,-200
loop1:
mov al,buf[si]
cmp bl,al
jle next1
mov bl,al
next1:
cmp dl,al
jge next2
mov dl,al
next2:
inc si
loop loop1
mov max,bl
mov min,dl
exit:
mov ax,4c00h
int 21h
CODE ENDS
END START
5、统计学生成绩
设有20个学生成绩分别56、78、67、40、87、99、63、51、74、100,90,80,68、88、55、66、84、96、45、73分。编写程序实现统计低于60分、60-69分、70-79分、80-89分、90-99分及100分的人数,并分别存放在s5、s6、s7、s8、s9、s10单元中。
DATA SEGMENT
buf dw 56,78,67,40,87,99,63,51,74,100,90,80,68,88,55,66,84,96,45,73
len equ ($-buf)/2
s dw ?
s5 dw 0
s6 dw 0
s7 dw 0
s8 dw 0
s9 dw 0
s10 dw 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
mov cx,len
mov si,0
loop1:
mov ax,buf[si]
cmp ax,60
jge n6
mov bx,s5
inc bx
mov s5,bx
jmp next
n6:
cmp ax,70
jge n7
mov bx,s6
inc bx
mov s6,bx
jmp next
n7:
cmp ax,80
jge n8
mov bx,s7
inc bx
mov s7,bx
jmp next
n8:
cmp ax,90
jge n9
mov bx,s8
inc bx
mov s8,bx
jmp next
n9:
cmp ax,100
jge n10
mov bx,s9
inc bx
mov s9,bx
jmp next
n10:
mov bx,s10
inc bx
mov s10,bx
next:
add si,2
loop loop1
exit:
mov ax,4c00h
int 21h
CODE ENDS
END START
6、查找字符
试编写一个有主程序和子程序结构的程序模块。
主程序:要求从键盘接收一串字符并存于字节数组TABLE中,显示字符CHAR出现的次数。
子程序:在以TABLE为首地址的字节数组中查找CHAR,统计出现的次数。
DATA SEGMENT str db 'please enter:$' table db 50,?,50 dup (?) n db ? char db 'c' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA find proc near mov bl,0 mov cl,n mov si,2 loop1: mov al,table[si] cmp al,char jne next1 inc bl next1: inc si loop loop1 ret find endp START:MOV AX,DATA MOV DS,AX lea dx,str mov ah,9 int 21h lea dx,table mov ah,10 int 21h mov cl,table[1] mov n,cl call find mov dl,10 mov ah,2 int 21h mov dl,bl add dl,'0' mov ah,2 int 21h exit: mov ax,4c00h int 21h CODE ENDS END START
编写环境:vscode+插件MASM/TASM+插件VSCode DOSBox
没配settings
MASM设置:
右键运行或调试
t执行下一步
u看命令地址,g跳转,g+空格+偏移地址即可
d看存储器信息,一般是d ds:0000
缓冲区设置:缓冲区大小,?,空间。例如:50,?,50 dup (?)