Tasmでプログラミングしていて、32ビットの数値を入力したいと思います。
数字ごとに入力する必要があることはわかっています(番号入力用の呼び出し関数が1つもないことを願っています)
これは私のコードです
. .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
Enterで入力を停止しています。
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-DOSCMD.exeウィンドウポップアップエラーが発生します: