如何在汇编中输入32位数字?

时间:2012-08-24 05:05:54

标签: assembly input x86 dos digit

我在Tasm编程并想输入32位数字。

我知道我必须逐位输入(我希望数字输入没有一个调用函数)

这是我的代码

    .        .486
    .model small
    .code
    start:

    mov ebx, 0

    ; enter again and again untill enter is hit
    again:
    mov ah,01h
    int 21h
    cmp al, 13
    jz next
    mov dl, al
    mov eax, ebx
    mov ebx, 10
    mul ebx
    mov ebx, eax
    mov eax, 0
    mov al, dl
    add ebx, eax
    jmp again

    ; now find the digits back

    next:
    ; just testing to see if i got number
    mov edx, 13
    mov ah, 02h
    int 21h

    mov edx, 10
    mov ah,02h
    int 21h

    mov edx, ebx
    mov ah, 02h
    int 21h

    mov eax, ebx

    mov ebx, eax

    xor edx, edx
    xor cl, cl

    ; find digits and push into stack from last to first so when i pop i get digits back
    finddigit:
    xor edx,edx
    mov ch , 10
    div ch
    push dx ;taking risk dx dl
    inc cl
    cmp eax, 0
    jz print
    jmp finddigit


    ; stored into cl the number of digits

    print:
    cmp cl,0
    jz exit
    dec cl
    pop dx
    mov ah,02h
    int 21h
    jmp print


    exit:
    end start

我在输入时停止输入。

我收到错误NTVDM遇到了严重错误。

由于

这是我修改后的新代码。它适用于某些数字,如2和123 但没有333,4444,555; (我希望推送和弹出不会修改除指定之外的任何寄存器):

.486
.model small
.code
start:

mov ebx, 0

; enter again and again untill enter is hit
again:
mov ah,01h
int 21h
cmp al, 13
jz next
mov cl, al
sub cl, 30h
mov eax, ebx
mov ebx, 10
mul ebx
mov ebx, eax
mov eax, 0
mov al, cl
add ebx, eax
jmp again

; now find the digits back

next:
; just testing to see if i got number
mov edx, 13
mov ah, 02h
int 21h

mov edx, 10
mov ah,02h
int 21h


mov eax, ebx

mov ebx, eax

xor ecx, ecx

mov ebx, ebp
; find digits and push into stack from last to first so when i pop i get digits back
finddigit:
xor edx,edx
mov ebp , 10
div ebp
push edx
inc cl
cmp eax, 0
jz print
jmp finddigit

; stored into cl the number of digits

print:
cmp cl,0
jz exit
dec cl
xor edx,edx
pop edx
add dl,30h
mov ah,02h
int 21h
jmp print


exit:
mov ah,4ch
int 21h               
end start

我正在运行这是MS-DOS CMD.exe窗口弹出错误来了:

Error

1 个答案:

答案 0 :(得分:2)

假设这是针对DOS环境的(由于int 21h):

您的代码中存在一些错误。

1.读取字符函数在al返回其输出,没关系。但是,您会立即使用以下序列销毁读取字符的值:

    mov dl, al    ; the character read now in dl
    mov eax, ebx  ; eax is now 0 in the first loop
    mov ebx, 10   ; ebx is now 10
    mul ebx       ; the result of mul ebx is now in edx:eax,
                  ; the character read (in dl) is lost.

因此,如果您要执行dl,则无法将该字符存储在mul ebx中,因为mul reg32会在edx:eax中输出结果。你可以存储它,例如。取而代之的是clch

2.我注意到的其他错误是你试图将ASCII值乘以10(在前面的代码中)。您应该先在乘法之前减去每个读取字符的“0”值,即sub al, 30hsub al, '0'

3.第三个错误按以下顺序排列:

   xor edx,edx
   mov ch , 10
   div ch
   push dx ;taking risk dx dl
   inc cl
   cmp eax, 0
   jz print
   jmp finddigit

修改:您要将ax除以ch,这显然不适用于32位除法。由于您希望在eax中获得红利,请将edxxor edx, edx一起清除(与您一样),然后将edx:eax与32位寄存器分开,例如。 ebpesiedi(到目前为止您的代码中似乎未使用这些内容),您将获得eax中的商和{{1}中的余数}}