2016-05-12 79 views
0

我遇到了我的汇编代码问题。每当我调试这个代码时,Division Overflow是总是错误的。当AX的值只有两位数时,代码平稳运行。汇编语言 - 分区溢出(4位数)

我需要做什么改变才能使分区工作4位数值?谢谢。

ASSUME DS:DATA, CS:CODE 

    DATA SEGMENT 

    X  DW   0 

    Y  DW   ? 

    s  DB   "The aswer is", 0 

    Z  DW   4 

    DATA ENDS  
    CODE SEGMENT 

    MAIN PROC 

    MOV DS:[Y],23 
    MOV AX,[Y] 
    ADD AX,4556 
    MOV [X],AX 
    PUSH[X] 
    CALL WRITE 
    POP[X] 

    MOV AH,4CH 
    INT 21H 

    MAIN ENDP 

    WRITE PROC 

    PUSH BP 
    MOV BP,SP 

    MOV AX,0B800H 
    MOV ES,AX 
    MOV ES,AX 
    MOV DI,5*160 

    MOV AX,[BP+4] 
    MOV BL,10 
    DIV BL 
    ADD AL,'0' 
    STOSB 

    XCHG AH,AL 
    ADD AL,'0' 
    STOSB 
    MOV AL, 00001111B 
    STOSB 

    POP BP 
    RET 
    WRITE ENDP 

    CODE ENDS 
    END  MAIN 
+0

你可以'添加斧子'00''(或'3030h')一次做al和ah。然后,你可以'stosw'来一次存储它们。你可以'mov byte ptr [di],00001111B',而不是先在'AL'中加入一个值。 –

回答

3

当你DIV r/m8(例如DIV BL)的商将被存储在AL,所以如果商大于255,你会得到一个部门溢出。

如果你想能够处理商最多(但不包括)65536,使用DIV r/m16

XOR DX, DX ; DIV r/m16 divides the 32-bit value DX:AX by the divisor, so we need to clear DX 
MOV BX, 10 
DIV BX 
; The quotient is now in AX, and the remainder in DX 

为了能够处理更大规模的商,使用DIV r/m32DIV r/m64。我将把它作为一个练习,让您在英特尔的指令集参考中查找它们。