定义双子类型:
A DD 21111112H
B DD 11111111H
上面的A和B都是32位,而ax,dx都是16位,所以需要把高16位和低16位分开进行加法。其中先处理低16位,用add。高16位可能会有进位,所以用adc。
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