『壹』 匯編編程 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 p(?)
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 '+-*/' ;運算符
Procere 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 Procere[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 ;編譯到此結束
『貳』 編寫程序實現在內存地址3000H:0100H~0200H范圍內查找字元「#」,若找到,則在
這個問題需要根據具體的開發環境和編程語言來確定,下面提供一種基於匯編語言的實現方案。
首先,我們需要訪問內存地址3000H:0100H~0200H范圍內的數據。假設我們的程序運行在實模式下,可以使用寄存器ES存儲目標段地址3000H。然後,我們使用寄存器DI存儲偏移地址0100H,將ES:DI指向數據的起始地址。
接下來,我們需要查找字元「#」。可以使用循環結構逐個比較每個位元組的值,找到字元「#」時跳轉到相應的處理代碼。具體實現代碼如下:
以上代碼使用LODSB指令按位元組讀取數據,並使用CMP指令比較位元組的值,根據比較結果跳轉到相應的處理代碼。如果找到字元「#」後,可以在HANDLECHAR代碼中添加相應的處理邏輯。如果未找到,可以在NOTFOUND代碼中添加相應的處理邏輯。