编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字操作数,假设计算结果为16位,可以放在z中)。要求:(1)通过堆栈传送参数x和y;(2)将计算结果按照10进制输出到屏幕上。
1.通过堆栈传参,需要在主程序中将参数压入堆栈,然后在堆栈中通过BP找到参数。
2.将一个有符号字操作数转为十进制输出
1)首先判断数据是为0,若为0,则直接显示输出
2)若数据为负数,则需要显示‘-’,然后求其绝对值
3)将10压入栈,作为显示输出结束的判断标志
3)将数除以10,余数加上30H,转为ASCII码,然后将其压栈
4)若商为0,则从栈中读取数据并显示。读取到10时,程序结束

stack segment stack
dw 1024 dup(?)
stack ends
data segment
x dw 5
y dw 10
z dw 0
data ends
code segment 'code'
assume cs:code,ds:data,ss:stackstart: mov ax,data
mov ds,ax
sub sp,2 ;预留空间存放z
push y
push x
call cal ;调用子程序
pop z
mov ax,z
test ax,ax ;此处也可以用cmp ax,0等
jnz done1
mov dl,'0' ;为0,直接输出
mov ah,02h
int 21h
jmp overdone1: xor dx,dx
mov bx,10
push bx ;压10,作为最后的输出标志
add ax,0
jns done2 ;正数,跳转到done2处理
mov cx,ax ;负数,先显示‘-’
mov dl,'-'
mov ah,02h
int 21h
mov ax,cx
neg ax ;求负数绝对值
done2: xor dx,dx
div bx ;转换为十进制
add dx,30h
push dx ;余数dx压栈
cmp ax,0
jz done3
jmp done2
done3: pop dx ;从堆栈中弹数并显示
cmp dx,10 ;读取到数据为10时,结束程序
jz over
mov ah,02h
int 21h
jmp done3over: mov ah,4ch
int 21h
cal proc
push bp
mov bp,sp
push ax
push bx
push dx
mov ax,[bp+4] ;x
mov bx,[bp+6] ;y
imul bx ;x*y
add ax,[bp+4] ;x*y+x
sub ax,bx ;x*y+x-y
mov [bp+8],ax
pop dx
pop bx
pop ax
pop bp
ret 4
cal endp
code ends
end start
