微机原理与汇编语言2

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的用法。

  1. 乘法指令mul :mul cl
    默认的是用AL×CL,得到的结果存入16位寄存器AX中.
    所以在之前应该先给AL,CL赋值,必须是AL。

  2. 键盘输入的功能函数:

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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值