- ;本程序综合多种子程序传参法,包括寄存器传参,地址表传参,堆栈传参
- data segment
- num1Message db 'please input num1:','$'
- num2Message db 'please input the num2:','$'
- resultMessage db 'result:','$'
- yushuMessage db 'yushu:','$'
- choiceMessage db '1.add 2.sub 3.mul 4.div','$'
- pleaseChoice db 'please choice the number what you want:','$'
- continue db '---------------------------------------------','$'
- exit db 'if you want to exit,input 0','$'
- exit_input db ?
- choiced db ?
- num1 db 50,0,50 dup(?)
- num2 db 50,0,50 dup(?)
- result dw ?
- yushu dw ?
- factor db 10
- data ends
- stack segment
- dw 100 dup(?)
- tos label word
- stack ends
- code segment
- main proc far
- assume cs:code,ds:data
- start:
- ;----------------------------------------------------程序初始化-----
- mov ax,stack
- mov ss,ax
- lea sp,tos
- push ds
- xor ax,ax
- push ax
- mov ax,data
- mov ds,ax
- loop_main:
- ;---------------------------界面和选择-------------------------------
- call init
- call choice
- ;----------------------------操作数----------------------------------
- lea dx,num1Message ;寄存器传参
- call message
- lea dx,num1 ;寄存器传参
- call input ;输入num1
- push bx ;保存BX,即NUM1,堆栈传参
- ;空格
- mov dl,0ah
- mov ah,02h
- int 21h
- mov dl,0dh
- mov ah,02h
- int 21h
- lea dx,num2Message
- call message
- lea dx,num2
- call input ;输入num2
- push bx ;保存BX,即NUM2
- ;------------------------------跳转到相应的操作---------------------
- cmp al,'1'
- jz result_sum
- cmp choiced,'2'
- jz result_sub
- cmp choiced,'3'
- jz result_mul
- cmp choiced,'4'
- jz result_div
- result_sum:
- call sum
- jmp print_result
- result_sub:
- call substract
- jmp print_result
- result_mul:
- call mult
- jmp print_result
- result_div:
- call divs
- print_result:
- call ctrl
- lea dx,resultMessage
- call message
- call output
- ;-------除法,余数另外输出--------
- call ctrl
- cmp choiced,'4'
- jnz end_print
- lea dx,yushuMessage
- call message
- mov ax,yushu
- mov result,ax
- call output
- call ctrl
- ;------------------
- end_print:
- lea dx,exit
- call message
- call ctrl
- lea dx,continue
- call message
- call ctrl
- mov ah,01h
- int 21h
- cmp al,'0'
- jnz loop_main
- pop ax
- pop ds
- mov ax,4c00h
- int 21h
- main endp
- ;----------------------------子程序部分-----------------------------
- sum proc near
- push bp
- mov bp,sp
- push si
- push di
- mov si,[bp+6] ;num1
- mov di,[bp+4];num2
- add di,si
- mov result,di
- pop di
- pop si
- pop bp
- ret 4
- sum endp
- substract proc near
- push bp
- mov bp,sp
- push si
- push di
- mov di,[bp+6] ;num1
- mov si,[bp+4];num2
- sub di,si
- mov result,di
- pop di
- pop si
- pop bp
- ret 4
- substract endp
- mult proc near
- push bp
- mov bp,sp
- push ax
- push bx
- mov ah,0
- mov al,byte ptr [bp+6] ;num1
- mov bh,0
- mov bl,byte ptr [bp+4];num2
- mul bl
- mov result,ax
- pop bx
- pop ax
- pop bp
- ret 4
- mult endp
- divs proc near
- push bp
- mov bp,sp
- push ax
- push bx
- mov ax,[bp+6] ;num1
- mov dx,0
- mov bx,[bp+4];num2
- div bx
- mov result,ax
- mov yushu,dx
- pop bx
- pop ax
- pop bp
- ret 4
- divs endp
- init proc near
- lea dx,choiceMessage
- call message
- call ctrl
- lea dx,pleaseChoice
- call message
- call ctrl
- ret
- init endp
- choice proc near
- ;lea dx,choiceMessage
- ;mov ah,09h
- ;int 21h
- ;call ctrl
- mov ah,01h
- int 21h
- mov choiced ,al
- call ctrl
- ret
- choice endp
- ctrl proc near
- mov dl,0ah
- mov ah,02h
- int 21h
- mov dl,0dh
- int 21h
- ret
- ctrl endp
- input proc near
- mov al,0
- mov ah,0ah
- int 21h
- add dx,1
- mov si,dx
- mov cl,[si]
- mov ch,0
- mov bx,0
- next:
- mov ax,bx
- mul factor
- mov bx,ax
- inc si
- mov al,[si]
- mov ah,0
- sub al,30h
- add bx,ax ;bx存十进制
- loop next
- ret
- input endp
- output proc near
- mov ax,result
- mov dx,0
- mov cx,0
- loop1:
- div word ptr factor
- push dx
- inc cx
- mov dx,0
- cmp ax,0
- jz show
- jmp loop1
- show:
- pop dx
- add dx,30h
- mov ah,02h
- int 21h
- loop show
- ret
- output endp
- message proc near
- mov ah,09h
- int 21h
- ret
- message endp
- code ends
- end start
汇编实现的加减乘除四则运算
最新推荐文章于 2023-01-19 00:14:47 发布