2016-05-12 2 views
0

У меня проблема с кодом сборки. Всякий раз, когда я отлаживаю этот код, 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

Вы можете «добавить ax, '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/m32 или DIV r/m64. Я оставлю это как упражнение для вас, чтобы посмотреть их в справочной системе Intel.

Смежные вопросы