-1

関連するが、現在の状況には役立たない: nasm dos interrupt (output string)

(これは重複していないことを明確にしたかっただけです)

私がやろうとしているのは、ユーザーに「Enter a Base 10 number:」というプロンプトを作成することです。その後、その数値を 2 進数、8 進数、16 進数に変換します。しかし、私は問題に出くわしています。それは非常に単純だと確信していますが、何が問題なのかを理解するにはあまりにも長い間このコードを見つめてきました。

「Enter a Base Ten Number:」が出力され、約 3 回点滅して、DOSbox エミュレータが自動的にシャットダウンされます。何か案は?

コードは次のとおりです。

org   0x100               

mov   bx, 1                  ;init bx to 1
mov   ax, 0100h

mov   dx, msg                ;message's address in dx
mov   cx, len
mov   ah, 0x40
int   0x21

msg   db 'Enter a Base Ten Number: '
len   equ $ -msg

;all of the code above runs fine it seems. It gets to this point
;but does not then run the following code

mov   ah, 9
int   21h

while:
        cmp   ax, 13        ;is char = carriage return?
        je    endwhile      ;if so, we're done
        shl   bx, 1         ;multiplies bx by 2
        and   al, 01h       ;convert character to binary
        or    bl, al        ;"add" the low bit
        int   21h
        jmp   while
endwhile
4

3 に答える 3

2
int   0x21

msg   db 'Enter a Base Ten Number: '  <- OOPS. This will be executed as code.
len   equ $ -msg

;all of the code above runs fine it seems. It gets to this point
;but does not then run the following code

mov   ah, 9

コード パスにデータを配置しました。msg保存したものが一連の命令ではないことを CPU が知る方法はありません。jmpデータの後のラベルにジャンプする の後にを実行するかint 0x21、プログラム内のすべてのコードの後に​​データを配置します。

于 2015-03-14T06:49:35.910 に答える
1

msgコードを含むテキスト セグメントに配置しました。そのため、実行すると意図しないことが起こります。

msg初期化されたデータの適切なセクションに、次のように配置します.data

section .data
    msg:  db 'Enter a Base Ten Number: '
    len   equ $ -msg

section .text
start:
    mov   bx, 1
    # etc.

COM ファイルの作成方法については、NASM のドキュメントを参照してください。

于 2015-03-14T07:02:12.733 に答える