我在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窗口弹出错误来了:
答案 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
中输出结果。你可以存储它,例如。取而代之的是cl
或ch
。
2.
我注意到的其他错误是你试图将ASCII值乘以10(在前面的代码中)。您应该先在乘法之前减去每个读取字符的“0”值,即sub al, 30h
或sub 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
中获得红利,请将edx
与xor edx, edx
一起清除(与您一样),然后将edx:eax
与32位寄存器分开,例如。 ebp
,esi
或edi
(到目前为止您的代码中似乎未使用这些内容),您将获得eax
中的商和{{1}中的余数}}