8086彙編計算分段函數值

題目(題目來源):

計算給定分段函數在不同輸入時的取值。

要求:

編制程序,計算下面函數值:





圖1 題目要求

其中,從鍵盤輸入x與y,輸出數據爲a。
輸入輸出時候都要求有提示信息。
考查知識點:分支結構的應用。

環境:

操作系統:
Windows 10 Pro N for Workstation
模擬器:
DosBox 0.74
編譯器:
masm 5.0
鏈接器:
link 3.6
實現:
8086彙編語言

結果如下所示:


圖2 編譯代碼




圖3 鏈接代碼




圖4 執行代碼(輸入的兩個數均爲正)




圖5 執行代碼(輸入的兩個數均爲負)




圖6 執行代碼(輸入的兩個數異號以及輸入均爲0)


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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章