0

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ウィンドウポップアップエラーが発生します:

エラー

4

1 に答える 1

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 ebxmul reg32edx:eaxclch

2.私が気付いた他のバグは、ASCII値に10を掛けようとしていることです(前のコードで)。乗算する前に、最初にすべての読み取り文字の「0」の値を減算する必要があります。つまり、sub al, 30hまたはsub al, '0'です。

3.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してから、32ビットレジスタでxor edx, edx除算します。、または(これらはこれまでのコードでは使用されていないようです)、商を取得し、余りを。に取得します。edx:eaxebpesiedieaxedx

于 2012-08-24T06:34:36.677 に答える