1

現在、独自のブートローダーを構築しようとしていますが、奇妙なことに気付きました。

以下のコードが、マークされた NOP コマンドを使用せずに NASM または Yasm でアセンブルされると、次の CALL がバイナリから欠落します。NOP が含まれていると、CALL は正しくアセンブルされますが、op コード 0x90 (NOP) はバイナリに存在しません (NOP の性質により、後で理解できます)。

to_hex_ascii:
        add al, '0'
        cmp al, 0x3a
        jl .end
;           add al, 0x07
            add al, 0x27
    .end:
        ret

print_word_hex:
        push bp
        mov bp, sp

        mov dx, [bp + 4]
        push dx
        mov al, dh
        push ax             ;\
        nop                 ; | <- NOP in question
        call print_lsb_hex  ; print_lsb_hex(ax);
        add sp, 2           ;/
        pop dx
        jmp print_lsb_hex.continue
print_lsb_hex:
        push bp
        mov bp, sp

        mov dl, [bp + 4]
    .continue:
        mov ah, 0x0e
        ; 0xf0
        mov al, dl
        and al, 0xf0
        shr al, 4
        call to_hex_ascii
        int 0x10  ; BIOS print call
        ; 0x0f
        mov al, dl
        and al, 0x0f
        call to_hex_ascii
        int 0x10  ; BIOS print call

        pop bp
        ret
4

1 に答える 1

2

行の最後のバックスラッシュ文字 '\' は、Nasm の「行継続文字」です。コメントに入れると、コメントは次の行に続きます - nop または call をコメントアウトします。(そのまま消えるのはノップの性ではありません!)。それを失うか、その後に何かを置きます。

– フランク・コトラー


NASM マニュアルの3.1 Layout of a NASM Source Lineから:

NASM はバックスラッシュ ( \) を行継続文字として使用します。行がバックスラッシュで終わる場合、次の行はバックスラッシュで終わる行の一部と見なされます。

于 2015-04-30T10:32:05.090 に答える