如何在Assembly中执行整数除法?非法覆盖寄存器错误

时间:2015-12-28 15:32:24

标签: assembly x86 tasm

到目前为止,我已经想出了一种如何从输入中获取Integers以及如何输出它们的方法。如果我可以执行整数除法,那将会很酷。有人可以告诉我它基本上是如何完成的吗?为什么我收到这个错误?

以下是代码:

.MODEL SMALL
.STACK 200h
.DATA
    InAMess DB 'Enter A:',0ah,'$'
    InBMess DB 'Enter B:',0ah,'$'
    Res DB 'Result of two integer division:$'

    a dw 0
    b dw 0
.CODE
start:
mov ax, @Data
mov ds, ax

jmp action

inputNumber proc
    nextchar:
    mov ah, 01h
    int 21h 
    cmp al, 2fh
    jl outp 

    sub al, 30h
    xor ah, ah
    xchg ax, bx
    mov dx, 0Ah
    mul dx
    add bx, ax

    jmp nextchar
    outp:
    ret
inputNumber endp

OutputNumber proc
    aam
    add ax, 3030h
    mov dl, ah
    mov dh, al
    mov ah, 02
    int 21h
    mov dl, dh
    int 21h
    ret
OutputNumber endp

action:

mov ah, 9h
mov dx, OFFSET InAMess
int 21h

call InputNumber
mov a, bx
mov bx, 0

mov ah, 9h
mov dx, OFFSET InBMess
int 21h

call InputNumber
mov b, bx
mov bx, 0 

mov ah, 9h
mov dx, OFFSET Res
int 21h 

;Here it is
mov dx,0
mov dx:ax, a
div b

mov ax, a
call OutputNumber

mov ah, 4ch
mov al, 0
int 21h

END start

错误: enter image description here

1 个答案:

答案 0 :(得分:4)

mov dx:ax, a无效。 dx:ax符号仅表示您应将高位词放入dx,将低位词放入ax。由于您的a只是一个单词,并且未签字,因此您可以将其放入ax和零dx(您已经完成)。所以:

mov dx, 0
mov ax, a
div b