2、编写子程序,其功能是从键盘输入数字字符(例如‘1’‘2’‘6’‘a’),在程序中得到对应的数值(126),然后在主程序中进行调用。(如果有入口参数或出口参数,请给出注释说明。)
用到的指令请参考实验3,子程序定义用proc 和endp,调用子程序用call指令。
注意: 分析这个子程序有入口参数吗?有出口参数吗?
子程序定义时的位置应该放在哪里?放在主程序中,还是主程序外?
子程序最后要用ret指令返回。
子程序中为什么要用到压栈和出栈操作?应该对哪些寄存器压栈和出栈。
调用定义好的子程序需要用哪条指令?
我们可以用某个寄存器来保存处理后的结果,我们还需要对这个寄存器进行压栈和出栈操作吗,为什么?
DATAS SEGMENT
a1 dw ?
a2 dw ?, ?, ?, ?, ?
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 si, offset a1
mov [si], ax
call output
MOV AH,4CH
INT 21H
input proc
mov cl, 10
mov bx, 0
L0: mov ah, 1
int 21h
sub al, 48
cmp al, 0
jb over
cmp al, 9
ja over
mov ah, 0
push ax
mov ax, bx
mul cl
pop bx
add bx, ax
jmp L0
over:
mov ax, bx
ret
input endp
output proc
; 调用输出
mov ch, 0
mov cl, 10
; 每次循环除以 cl
L0: div cl
; 除以 cl 以后,结果在 al 中,余数在 ah 中
;将余数入栈
push ax
; ch 每次增加,记录位数
inc ch
mov ah, 0
cmp al, 0
ja L0
L1: ; 输出函数
cmp ch, 0
je over2
; 出栈,将栈顶元素存储到 dx 中
pop dx
mov dl, dh
add dl, 48
mov ah, 2
int 21h
dec ch
jmp L1
over2:
ret
output endp
CODES ENDS
END START