2

組み立て用のatoi関数を作っています。
何を試してもうまくいかず、その理由がわかりません。

誰が問題が何であるか知っていますか?

org 100h

mov si, stri     ;parameter
call atoi        ;call function
pop eax          ;result
mov [broj], eax  ;save
mov ah, 9        ;display (in ascii, because I don't have itoa function yet either)
mov dx, broj
int 21h

mov ah, 8
int 21h
int 20h

atoi:
    mov eax, 0 ;stores result
    mov ebx, 0 ;stores character
atoi_start:
    mov bl, [si] ;get character
    cmp bl, '$' ;till dollar sign
    je end_atoi
    imul eax, 10 ;multiplu by 10
    sub bl, 30h ;ascii to int
    add eax, ebx ;and add the new digit
    inc si ;;next char
jmp atoi_start
end_atoi:
    push eax ;return value
    ret

stri db '1000$'
broj: db ?,?, '$'
4

1 に答える 1

3

問題は、 から戻る直前に eax をスタックにプッシュすることですatoiretスタックの一番上からのデータを戻りアドレスとして使用します。考えられる解決策: eax をスタックにプッシュせず、単純atoiに eax に答えを返してください。pop eaxしたがって、コードの主要部分には必要ありません。

これに加えて、 がメモリ ロケーションが存在DSするコード セグメントを指していることも確認する必要があります。striプログラムからの通常の終了には、int 21 function 4Ch を使用します。int 20 の使用は、MS DOS 2.0 以降では推奨されていません。

于 2013-10-28T19:37:55.650 に答える