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