2

私の期待は、文字列を印刷することですが、何も印刷されません。文字列を短くするとうまくいくこともあれば、もう一度長くするとうまくいくこともあります。

なぜこれが機能しないのかわかりません。

誰かが私を助けてもらえますか?ありがとう。

私が使用しているアセンブリコードは次のとおりです。

(Emacs 23、Ubuntu 10.10、nasm、VirtualBox OSE)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x7c00
bits 16
str:
    db "Some say the world will end in fire",10,13
    db "Some say in ice",10,13
    db "From what I've tasted of desire",10,13
    db "I hold with those who favor fire",10,13
    db "But if I had to perish twice,",10,13
    db "I think I know enough of hate",10,13
    db "To say that for destruction ice",10,13
    db "is also great and would suffice."
    db "Robert Frost - Fire and Ice"
    db 0
start:
    xor ax,ax
    mov ds,ax
    mov es,ax
    mov si, str
    xor bx,bx
    mov ah, 0x0e
print:
    lodsb   ;al = current char
    cmp al, 0
    je end
    int 0x10
    jmp print
end:    
    cli
    hlt

    times 510 - ($-$$) db 0
    dw 0xAA55
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4

2 に答える 2

9

の命令でコードの実行を開始するため7c00です。それは、残念ながらあなたがあなたのひもを持っているところです。

その文字列の前にjmp命令を付けて、にジャンプするようにする必要がありますstart

これは通常、短いジャンプEB xxの後にNOPが続き90ます。一部のBIOSは、プロセッサにとって実際には重要ではない場合でも、この形式であると主張する場合があります。

言い換えれば、あなたは次のようなものを探しているでしょう:

org 0x7c00
bits 16
realstart:
    jmp short start
    nop
str:
    db "Some say the world will end in fire",10,13
    :
    db "Robert Frost - Fire and Ice"
    db 0
start:
    xor  ax,ax
    :

短いジャンプは、移動できる距離が約+/- 128バイトに制限されているため、文字列サイズは必然的にそれによって制限されることに注意してください。BIOSがフォーマットを必要としない場合EB xx 90は、通常のジャンプを実行できます。

hltあなたが試みることができる他のことは、命令の後に文字列全体を移動することです:

org 0x7c00
bits 16
start:
    xor  ax,ax
    :
end:    
    cli
    hlt
str:
    db "Some say the world will end in fire",10,13
    :
    db "Robert Frost - Fire and Ice"
    db 0

ただし、これもjmp/nop、最初にコンボを必要としないBIOSによって異なります。

于 2011-04-18T07:02:49.560 に答える
1

paxdiabloとIgorSkochinskyが正しいことを確認する良い方法は、テキスト文字列をファイルに入れてから、逆アセンブラで実行することです。適切に印刷される短い文字列は、何も害を及ぼさないコード文字列に分解する必要があります。失敗する短い文字列と長い文字列には、不正な命令、ジャンプまたは呼び出し命令が含まれるか、"xor ax,ax"コードの先頭にある命令のオペコードを消費する2バイトまたは3バイトの命令が最後に含まれます。 。

于 2011-05-16T15:52:12.103 に答える