1、编写程序,将AX中的数以无符号十进制形式输出显示。
用到的指令有mov、cmp、无条件转移指令jmp、带条件转移指令je、ja、jb等,div、push、pop、add和输出一个字符的功能函数mov ah,2 int 21h。
注意:循环之前要对用到的寄存器进行初始值设定? 循环使用的是while形式还是do-while形式? 比较指令之后,可以跟带条件转移指令,转移条件是什么?此处要考虑如何跳出循环(即结束循环),要想清楚条件成立怎么走,条件不成立怎么走? 无条件指令jmp应该跳转到哪里才能构成循环? 计数器用什么用处?
mov ax,1532
mov cl,10
mov bx,0 ;计数
L0:
div cl ;除10
push ax ;入栈
mov ah,0 ;抹零
add bx,1 ;计数
cmp al,0
je L1 ;商为0则输出,否则继续除10
jmp L0
L1:
cmp bx,0 ;出栈的次数由计数bx决定
je over
pop ax ;出栈到任意一个寄存器
mov dl,ah ;输出
add dl,48
mov ah,2
int 21h
sub bx,1 ;计数器减1
jmp L1
over:
输出一个随机数时,把得到的商和0比较,如果商为0则结束循环开始输出,否则继续做循环。需要由计数器计数压栈的次数。
除10,入栈,抹零,计数
输出的随机数得到的第一个商必须不大于255,否则超出8位al寄存器的内存。
2、编写程序,从键盘输入数字字符(例如‘1’‘2’‘6’‘a’),在程序中得到对应的数值(126),在利用1中的输出功能,将得到的数值输出显示。
用到的指令有输入一个字符的功能函数mov ah,1 int 21h和cmp、无条件转移指令jmp、带条件转移指令je、ja、jb等,sub、mov、mul、add等;输出显示时用到的指令请参考题目1。
注意:循环之前要对用到的寄存器进行初始值设定?
循环使用的是while形式还是do-while形式?
如何判断输入的字符是否是数字字符?
比较指令之后,可以跟带条件转移指令,转移条件是什么?此处要考虑如何跳出循环(即结束循环),要想清楚条件成立怎么走,条件不成立怎么走?
无条件指令jmp应该跳转到哪里才能构成循环?
注意乘法指令MUL的用法。
-
乘法指令mul :mul cl
默认的是用AL×CL,得到的结果存入16位寄存器AX中.
所以在之前应该先给AL,CL赋值,必须是AL。 -
键盘输入的功能函数:
mov ah,1
int 21h
键盘输入的字符默认的放在AL中,AL中存放的是ASCⅡ码,所以AL中应该要减去48才能得到数值。
建议采用循环的方式写:(第二个)
;单独输入
mov ah,1
int 21h ;输入1,存放在al中
sub al,48 ;得到数值1
mov cl,al ;把al里的3转存到cl中,防止之后的再次输入将3的值覆盖,cl=1
mov ah,1
int 21h ;输入2,存放在al中
sub al,48 ;得到数值2
mov dl,al ;将al的值转移,dl=2
mov dh,0 ;把dl与dx一样,以方便下面做加法时相同类型的数才能做加减
;做乘法,用cl×10+dl
mov al,cl
mov bl,10
mul bl ;乘法结果存入AX中
add ax,dx ;得到结果12
mov cx,ax ;将结果转存入cx,否则下面输入的时候会影响ax的值,cx=12
mov ah,1
int 21h ;输入3
sub al,48 ;得到数值3
mov dl,al
mov dh,0
;做乘法,用cl×10+dl
mov al,cl
mul bl ;结果存入ax中
add ax,dx ;得到结果123
mov cx,ax ;转存ax,cx=123
;还可以继续输入
;......
over: ;输出,结果存入cx中,按照第一题的输出方式输出
mov dl,0ah
mov ah,02h
int 21h ;换行输出结果
mov ax,cx
mov cl,10
mov bx,0
L0:
div cl ;除10
push ax ;入栈
mov ah,0 ;抹零
add bx,1 ;计数
cmp al,0
je L1 ;商为0则输出,否则继续除10
jmp L0
L1:
cmp bx,0 ;出栈的次数由计数bx决定
je L2
pop ax ;出栈到任意一个寄存器
mov dl,ah ;输出
add dl,48
mov ah,2
int 21h
sub bx,1 ;计数器减1
jmp L1
L2:
还可以采用循环的方式更简单。
;使用循环的方法输入,8位寄存器最多输入255_
mov bl,10
mov cx,0 ;将上次的结果存入cx中,初始值为0,最多不能超过255
again:
mov ah,1
int 21h ;键盘输入数值,存入al中
cmp al,'0' ;判断输入的字符是不是结束的,只有输入的字符的ASCⅡ码值在0-9之间才是。
jb over ;如果输入结束则就需要输出了。
cmp al,'9'
ja over
sub al,48 ;取al的值,得到数值
mov dl,al ;下面要乘法的时候用到al,将al转存进dl
mov dh,0 ;将dl与dx一样,方便下面的加法
mov al,cl
mul bl
add ax,dx
mov cx,ax ;把得到的结果存入cx中
;再次输入
jmp again
over: ;输出,结果存入cx中,按照第一题的输出方式输出
mov dl,0ah
mov ah,02h
int 21h ;换行输出结果
mov ax,cx
mov cl,10
mov bx,0
L0:
div cl ;除10
push ax ;入栈
mov ah,0 ;抹零
add bx,1 ;计数
cmp al,0
je L1 ;商为0则输出,否则继续除10
jmp L0
L1:
cmp bx,0 ;出栈的次数由计数bx决定
je L2
pop ax ;出栈到任意一个寄存器
mov dl,ah ;输出
add dl,48
mov ah,2
int 21h
sub bx,1 ;计数器减1
jmp L1
L2:
;输入:123a
;输出:123
DATAS SEGMENT
a0 byte 5
a1 byte 12,125,6,234,123
a2 byte ‘A’,‘B’,‘C’,‘D’,65,49,‘!’
a3 word 18
a4 word 12,5,6
DATAS ENDS
根据以上数据定义,完成下列题目:
3、变量a1中有几个元素?每个元素占几个字节?a1这个变量一共占多少个字节?
5,1,5
4、变量a4中有几个元素?每个元素占几个字节?a4这个变量一共占多少个字节?
3 , 2 , 6
5、offset a0等于多少?offset a1等于多少?offset a2等于多少?
0 , 1 , 6
6、编写程序,将a0中的值以无符号十进制形式显示输出。
mov dl,a0
add dl,48
mov ah,2
int 21h
7、编写程序,用循环结构把a1中的5个数以无符号十进制形式显示输出。(次数确定的循环)
mov bx,0 ;计数到5,a1中的5个数
mov dx,0 ;计数输出
mov si,offset a1
mov cl,10
again:
cmp bx,5
je over
mov al,[si]
mov ah,0
L0:
div cl ;除10
push ax ;入栈
mov ah,0 ;抹零
add bx,1 ;计数
cmp al,0
je L1 ;商为0则输出,否则继续除10
jmp L0
L1:
cmp bx,0 ;出栈的次数由计数bx决定
je L3
pop ax ;出栈到任意一个寄存器
mov dl,ah ;输出
add dl,48
mov ah,2
int 21h
sub bx,1 ;计数器减1
jmp L1
L3:
add si,1
add bx,1
mov dl,' '
mov ah,2
int 21h
jmp again
over:
8、编写程序,将a2中的数看成字符,把这些字符显示输出,直到遇到’!'字符结束。(次数不确定的循环)
mov si,offset a2
again:
mov dl,[si]
cmp dl,'!'
je over
mov ah,2
int 21h
add si,1
jmp again
over: