1. 程式人生 > >彙編(實現32位 加法,並呼叫int 10h 輸出結果)

彙編(實現32位 加法,並呼叫int 10h 輸出結果)

定義雙子型別: 

A DD 21111112H

 B DD 11111111H

上面的A和B都是32位,而ax,dx都是16位,所以需要把高16位和低16位分開進行加法。其中先處理低16位,用add。高16位可能會有進位,所以用adc。

A 32位數在記憶體中的表示
21
11
11
11
12

A+1即為 11,A+4即為21

至於輸出,使用了xlat表,先自己建立一個查詢表(用於輸出0-F),然後更據偏移來輸出。

程式碼:

DATAS SEGMENT
    ;此處輸入資料段程式碼 
    hextab db '0123456789ABCDEF'
    A DD 21111112H
    B DD 11111111H
    ans DD ? 
DATAS ENDS
;字資料指的是16位的,雙字資料指的是32位的

STACKS SEGMENT
    ;此處輸入堆疊段程式碼
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此處輸入程式碼段程式碼
    mov ax,word ptr A
    mov bx,word ptr B
	add ax,bx
	mov word ptr ans,ax
	mov ax,word ptr A+2
	mov bx,word ptr B+2
	adc ax,bx ; adc 將會把前一個add產生的進位標誌也加上
	mov word ptr ans+2,ax    
	
	lea bx,hextab
	mov ah,0eh;AH=0EH
	;AL 暫存器存要顯示的字元,BH 為目前的顯示頁,
	;如果是在圖形模式,則 BH 須設為 0,假如是在圖形模式下,
	;也可以設定 BL 來表示文字的顏色,文字模式下的 BL 則無功能
	mov dx,word ptr ans+2
	mov cx,404h
  c1:
	rol dx,cl
	mov al,dl
	and al,0fh
	
	xlat ;查表,使得AL←((BX)+(AL)
	int 10h
	dec ch
	jnz c1	
	
    mov dx,word ptr ans
    mov cx,0404h
   c2:
     rol dx,cl
     mov al,dl
     and al,0fh
     xlat
     int 10h
     dec ch
     jnz c2
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START