題目(題目來源):
計算給定分段函數在不同輸入時的取值。
要求:
編制程序,計算下面函數值:
圖1 題目要求
其中,從鍵盤輸入x與y,輸出數據爲a。
輸入輸出時候都要求有提示信息。
考查知識點:分支結構的應用。
環境:
操作系統:
Windows 10 Pro N for Workstation
模擬器:
DosBox 0.74
編譯器:
masm 5.0
鏈接器:
link 3.6
實現:
8086彙編語言
結果如下所示:
8086彙編實現代碼如下:
stack segment stack
db 512 dup(?)
stack ends
data segment
input1 db "input x(-32768~32767):", 0ah, 0dh, '$'
input2 db "input y(-32768~32767):", 0ah, 0dh, '$'
input3 db "x = ", '$'
input4 db "y = ", '$'
input5 db "a = ", '$'
x dw 0
y dw 0
a dw 0
data ends
code segment
assume ds: data, cs: code, ss: stack
main:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
lea dx, input1
mov ah, 09h
int 21h
;readsiw 輸入有符號十進制整數 (-32768~32767) 出口:AX=16位數據
call readsiw
mov [x], ax
;int 3 ;這句話有什麼用?
lea dx, input2
mov ah, 09h
int 21h
call readsiw
mov [y], ax
lea dx, input3
mov ah, 09h
int 21h
;dispsiw 顯示有符號十進制數據 入口:AX=16位數據
mov ax, [x]
call dispsiw
call lineFeed
lea dx, input4
mov ah, 09h
int 21h
mov ax, [y]
call dispsiw
call lineFeed
lea dx, input5
mov ah, 09h
int 21h
mov ax, [x] ;ax <- [x]
cmp ax, 0
jge x_bigger_0 ;x >= 0
jmp x_smaller_0
x_bigger_0:
mov bx, [y] ;bx <- [y]
cmp bx, 0
jnge opposite_Sign ;case 2: x >= 0 and y < 0, so x and y are opposite sign
mov ax, 1 ;case 1: x >= 0 and y >= 0
call dispsiw ;output 1
;mov [a], ax
;call lineFeed
jmp done
x_smaller_0:
mov bx, [y] ;bx <- [y]
cmp bx, 0
jg opposite_Sign ;case 3: x < 0 and y >= 0
mov ax, -1 ;case 4 :x < 0 and y < 0
call dispsiw ;output -1
mov [a], ax
;call lineFeed
jmp done
opposite_Sign:
mov ax, 0
call dispsiw ;output 0
mov [a], ax
;call lineFeed
jmp done
done:
mov ah, 4ch
int 21h
readsiw proc
push bx
push cx
push dx
xor bx, bx ;BX保存結果
xor cx, cx ;CX爲正負標誌,0爲正,-1爲負
mov ah, 1
int 21h
cmp al, '+'
jz rsiw1
cmp al, '-'
jnz rsiw2
mov cx, -1
rsiw1:
mov ah, 1
int 21h
rsiw2:
cmp al, '0'
jb rsiw3
cmp al, '9'
ja rsiw3
sub al, 30h
xor ah, ah
shl bx, 1
mov dx, bx
shl bx, 1
shl bx, 1
add bx, dx
add bx, ax
jmp rsiw1
rsiw3:
cmp cx, 0
jz rsiw4
neg bx
rsiw4:
mov ax, bx
pop dx
pop cx
pop bx
ret
readsiw endp
dispsiw proc
push ax
push bx
push dx
test ax, ax ;判斷數據是零、正數或負數
jnz dsiw1
mov dl, '0' ;是零,顯示“0”後退出
mov ah, 2
int 21h
jmp dsiw5
dsiw1:
jns dsiw2 ;是負數,顯示“-”
mov bx, ax
mov dl, '-'
mov ah, 2
int 21h
mov ax, bx
neg ax ;數據求補(絕對值)
dsiw2:
mov bx, 10
push bx ;10壓入堆棧,作爲退出標誌
dsiw3:
cmp ax, 0
jz dsiw4
xor dx, dx ;擴展被除數DX.AX
div bx
add dl, 30h ;餘數(0~9)轉換爲ASCII碼
push dx ;數據各位先低位後高位壓入堆棧
jmp dsiw3
dsiw4:
pop dx
cmp dl, 10
je dsiw5
mov ah, 2
int 21h
jmp dsiw4
dsiw5:
pop dx
pop bx
pop ax
ret
dispsiw endp
lineFeed proc
mov dx, 0ah;換行
mov ah, 02h
int 21h;執行輸出
ret
lineFeed endp
code ends
end main