當前位置:編程學習大全網 - 編程語言 - 匯編編程 2位十進制數的四則運算

匯編編程 2位十進制數的四則運算

; 本程序在MASMPlus 1.2集成環境下通過編譯,經過調試,運行正確。

Code Segment

Assume CS:Code,DS:Code

; -------------------------------------

; 功能:顯示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在數據段)

; 用法: Output Str_Addr

; 用法舉例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

; -------------------------------------

ASCII_Binary MACRO ;將兩位數字的ASCII碼轉換成二進制數

mov dl,10

lodsb

and al,0fh

mul dl

mov dx,ax

lodsb

and al,0fh

add al,dl

stosb

EndM

; -------------------------------------

; 功能:輸入兩位十進制數,將其保存在指定的內存單元

; 入口:es:di=保存輸入的數字首地址

; 出口:轉換後的二進制數保存在di所指的單元

Input_Dec Proc Near

push cx

push bx

cld

mov cx,2

@@Input_Dec: mov ah,7 ;從鍵盤接受壹個字符

int 21h

cmp al,'0'

jb @@Input_Dec ;若低於數字'0',重新輸入

cmp al,'9'

ja @@Input_Dec ;若高於數字'9',重新輸入

stosb ;保存

mov ah,0eh ;顯示這個數字

xor bh,bh

int 10h

loop @@Input_Dec ;接受下壹個數字

pop bx

pop cx

ret

Input_Dec EndP

; -------------------------------------

; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示

; 入口:AX=二進制數

; 出口:在當前光標位置顯示轉換後的ASCII碼數字

Unsi_Dec_ASCII Proc Near

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[5]

mov BYTE PTR [di],'$'

dec di

cld

@@Divide: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,ax

jnz @@Divide

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

ret

@@Temp_Save db 6 dup(?)

Unsi_Dec_ASCII EndP

; -------------------------------------

; 功能:鍵盤輸入壹個字符,若輸入的是'y'或'n'(不分大小寫),則顯示並返回

; 入口:無

; 出口:若輸入的是'y',進位標誌置位;若輸入的是'n',進位標誌復位。

Yes_or_No proc Near

push dx

push ax

@@Input_Chr: mov ah,7 ;不帶回顯的鍵盤輸入

int 21h

mov dl,al

and al,0dfh

cmp al,'Y'

jnz $+5

stc

jmp $+7

cmp al,'N'

jnz @@Input_Chr

clc

mov ah,2

int 21h

pop ax

pop dx

ret

Yes_or_No Endp

; -------------------------------------

; 加法運算

Addition Proc Near

mov ax,WORD ptr Number

add al,ah

xor ah,ah

call Unsi_Dec_ASCII ;顯示和

ret

Addition EndP

; -------------------------------------

; 減法運算

Subtration Proc Near

mov ax,WORD ptr Number

sub al,ah

xor ah,ah

call Unsi_Dec_ASCII ;顯示差

ret

Subtration EndP

; -------------------------------------

; 乘法運算

Multiple Proc Near

mov ax,WORD ptr Number

mul ah

call Unsi_Dec_ASCII ;顯示乘積

ret

Multiple EndP

; -------------------------------------

; 除法運算

Division Proc Near

mov ax,WORD ptr Number

mov bl,ah

xor ah,ah

div bl

push ax

xor ah,ah

call Unsi_Dec_ASCII ;顯示商數的整數部分

mov cx,6 ;寫字符次數

mov al,'.'

mov ah,0eh

@@Write_Dot: int 10h

loop @@Write_Dot

pop ax

xchg ah,al

or al,30h

mov ah,0eh

int 10h

ret

Division EndP

; -------------------------------------

prompt_Str db 13,10,10,'Please input an arithmetical expression:',13,10,'$'

Contin_Str db 13,10,10,'Continue(Y/N)?$'

Number db ?,? ;操作數存儲單元

Operators db '+-*/' ;運算符

Procedure dw Addition,Subtration,Multiple,Division

Press_Key db 7,13,10,10,'The complated. Press any key to exit...$'

Start: push cs

pop ds

push cs

pop es

Input_Expre: Output prompt_Str ;提示輸入算術表達式

lea di,Arith_Expre ;算術表達式緩沖區地址

call Input_Dec ;輸入兩位十進制數,將其保存在指定的內存單元

Input_Oper: mov ah,7

int 21h

cmp al,'+'

jz Store_Oper

cmp al,'-'

jz Store_Oper

cmp al,'*'

jz Store_Oper

cmp al,'/'

jnz Input_Oper

Store_Oper: stosb ;保存

mov ah,0eh ;顯示這個數字

xor bh,bh

int 10h

call Input_Dec

mov al,'='

mov ah,0eh

xor bh,bh

int 10h

lea si,Arith_Expre

lea di,Number ;操作數存儲單元地址

ASCII_Binary ;將兩位數字的ASCII碼轉換成二進制數

inc si

ASCII_Binary

mov al,BYTE ptr Arith_Expre[2] ;取運算符

mov cx,4

lea di,Operators

mov bx,di

repnz scasb

xchg di,bx

sub bx,di

dec bx

shl bx,1

call Procedure[bx] ;調用相應的運算子程序

Output Contin_Str

call Yes_or_No

jc Input_Expre

; -------------------------------------

Exit_Proc: Output Press_Key ;提示操作完成,按任意鍵結束程序

mov ah,1

int 21h

mov ah,4ch ;結束程序

int 21h

Arith_Expre: ;算術表達式緩沖區

Code ENDS

END Start ;編譯到此結束

  • 上一篇:整數分解詳細資料大全
  • 下一篇:什麽是數控?如何學好數控技術?編程難不難
  • copyright 2024編程學習大全網