【微机原理与汇编语言】子函数练习

1、编写子程序output,将AX中的数以无符号十进制形式输出显示。(如果有入口参数或出口参数,请给出相应注释进行说明。)

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
   
   
   ;main()
    MOV AX,1234  ;入口参数
    CALL OUTPUT ;call调用output函数
    
    MOV AH,4CH
    INT 21H
    
    
    OUTPUT PROC  ;output(){
    PUSH BX
    PUSH CX
    PUSH DX ;保留原始数据,防止中间计算错误找不到原始数据
    
    
    MOV BH,1;CNT:入栈次数
    MOV CL,10;除数
    
 AGAIN:
   
   DIV CL;AL->商 AH->余数
   PUSH AX;把余数AH和商AL一并推入栈,最少压两字节,目的压AH保存AH
   
   CMP AL,0
   JE PRINT
   INC BH  ;BH++
   MOV AH,0;保证AX只有商
   JMP AGAIN
PRINT:

   CMP BH,0
   JE  OUTPUTOVER
   POP DX; 栈顶元素出栈
   
   MOV DL,DH;DH里面放的余数 只要输出余数即可
   ADD DL,48
   MOV AH,2
   INT 21H
   DEC BH   ;BH--
   JMP PRINT
   
 OUTPUTOVER:
 
   POP DX
   POP CX 
   POP BX;与PUSH顺序相反 栈先进后出
   
   RET  ;return 
   
 OUTPUT ENDP  ;}
   

    
CODES ENDS
    END START

2、编写子程序input,从键盘输入数字字符(例如‘1’‘2’‘6’‘a’),在程序中得到对应的数值(126)。(如果有入口参数或出口参数,请给出相应注释进行说明。)
仅输入

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    CALL INPUT
   
    
    MOV AH,4CH
    INT 21H
    
INPUT PROC
  
  PUSH AX
  PUSH CX
  PUSH DX


    MOV DH,10 ;存乘数
 
L1:
   MOV AH,1
   INT 21H ;输入
   
   
   CMP AL,'0'
   JB L0
   CMP AL,'9'
   JA L0   ;不在0-9之内的直接跳到输出
   SUB AL,48
   MOV CL,AL;CL<-当前输入的数  CX=CL
   ;MOV CH,0  可有可无
   
   MOV AX,BX  ;MUL 默认是乘AX ,BX<-存着之前的数
   MUL DH
   ADD AX,CX  ;新数+原来的数*10
   
   MOV BX,AX  ;把加完后的数存到BX里
   JMP L1
   
L0:
   POP DX
   POP CX
   POP AX
    RET
INPUT ENDP ;出口参数是BX BX存着输入的数
    
CODES ENDS
    END START


输入+输出

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    CALL INPUT
    CALL OUTPUT
    
    MOV AH,4CH
    INT 21H
    
INPUT PROC
  
  PUSH AX
  PUSH CX
  PUSH DX


    MOV DH,10 ;存乘数
 
L1:
   MOV AH,1
   INT 21H ;输入
   
   
   CMP AL,'0'
   JB L0
   CMP AL,'9'
   JA L0   ;不在0-9之内的直接跳到输出
   SUB AL,48
   MOV CL,AL;CL<-当前输入的数  CX=CL
   ;MOV CH,0  可有可无
   
   MOV AX,BX  ;MUL 默认是乘AX ,BX<-存着之前的数
   MUL DH
   ADD AX,CX  ;新数+原来的数*10
   
   MOV BX,AX  ;把加完后的数存到BX里
   JMP L1
   
L0:
   POP DX
   POP CX
   POP AX
    RET
INPUT ENDP ;出口参数是BX BX存着输入的数


OUTPUT PROC ;入口参数是BX

        MOV AX,BX


        PUSH BX  ;此子程序需要使用寄存器BX,CX,DX,防止主程序中若使用这些寄存器,数被覆盖
    	PUSH CX
    	PUSH DX

   ;从这里开始是输出
   MOV BH,0 ;入栈计数器
   MOV CL,10
   
L2:
   
   
   DIV CL;AL:商 AH:余数
   PUSH AX ;压栈 压两个字节
   INC BH  ;BH++
   CMP AL,0 ;最后商为0 表示除尽
   JE PRINT
   
   MOV AH,0  ;AH=0 只除商
   JMP L2
   
PRINT:
 
     CMP BH,0 
     JE OUTOVER
     POP DX ;出栈
     DEC BH  ;BH--
     
     MOV DL,DH  ;最后输出的是余数
     ADD DL,48
     
     MOV AH,2
     INT 21H
     JMP PRINT
     
OUTOVER:
        POP DX
    	POP CX     ;将原来压栈的主程序中的数弹出
    	POP BX	   ;注意顺序 先入后出
    	RET        ;返回
    OUTPUT ENDP 

   

    
CODES ENDS
    END START

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值