汇编(实现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

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/83586164