4

私はアセンブリを学んでおり、もちろん古典的な 0x10 bios 割り込みを試しています。私が見たリソースはlodsb、文字列を出力するために使用していることを示しているため、そのオペコードを理解するために、その動作を模倣しようとしています。これはでは問題lodsbなく動作しますが、私が持っているものではうまくいきません。私は何を間違っていますか?:

始める:
    mov ah, 0Eh ; BIOS 割り込み用
    mov si, text_string ;ソース インデックスを text_string の先頭に設定

。繰り返す:
    ; lodsb の動作をエミュレートして、それがどのように機能するかを学習しようとしています:
    mov al, [si] ; al レジスタの si に文字を入れる
    add si, 1 ;ソース インデックスをインクリメントする

    cmp al, 0 ;文字がゼロの場合 (文字列の終わり)
    終了しました;実行を終了します

    int 10h ;文字を画面に表示するための bios 割り込み
    jmp .repeat

    text_string db 'Hello, World!', 0

終わり:
    戻る
4

2 に答える 2

5

通常、次のことはお勧めできません。

  1. すべてのレジスタが割り込み呼び出し (または実際にはすべての呼び出し) にわたって保持されていると仮定します。また
  2. 特定の呼び出しに必要なすべてのレジスタをセットアップしない。

その最初の音符では、の直前にを設定ahします。0ehint 10

Int 10h/0ehと をそれぞれページ番号と前景色に設定する必要がbhありblます。int 10また、呼び出しに対して正しく設定されていることを確認するために、の直前にそれを行います。


余談ですが、dsセグメント レジスタが正しいことを次のように確認する必要があります。

push cs
pop ds

文字列をコードセグメントに入れているように見えるからです。ただし、このlodsbバージョンは明らかに機能するので、それについては説明済みだと思います。

そして、(確かに色あせた)メモリから、8086にはinc si少量のスペースを節約できる命令がありますが、それはもはやそれほど重要ではありませんが、私はすべてのバイトがカウントされた時代に偽造されました:-)

于 2013-06-26T01:10:52.070 に答える