【汇编语言程序设计】

编写一个子程序计算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:stack

start:    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 over

done1:    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 done3

over:    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


版权声明:本文为xiaomin_549原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。