【问题标题】:NASM/Yasm drops CALL after comment ending with backslashNASM/Yasm 在评论以反斜杠结尾后放弃 CALL
【发布时间】:2015-04-29 18:28:07
【问题描述】:

我目前正在尝试构建自己的引导加载程序,但发现了一些奇怪的东西。

当下面的代码用 NASM 或 Yasm 组装而没有标记的 NOP 命令时,二进制文件中缺少以下 CALL。包含 NOP 后,CALL 已正确组装,但二进制中不存在操作码 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

【问题讨论】:

  • 反斜杠字符“\”作为一行的最后一个字符,是 Nasm 的“行继续符”。通过将其放在注释中,注释将继续到下一行 - 注释掉 nopcall。 (就这样消失不是nop 的本质!)。丢掉它,或者在它后面放点东西。
  • 是的,所以当您删除 nop 行时,call 将被注释掉。
  • 啊,没想到,谢谢
  • 还有;遵守 C 调用约定(并在堆栈上而不是在寄存器中传递参数并使用“堆栈帧指针”)是汇编语言程序员的标志,他们永远无法将他们需要的所有内容放入“

标签: assembly nasm yasm intel-syntax


【解决方案1】:

反斜杠字符“\”是一行的最后一个字符,是 Nasm 的“行继续字符”。通过将其放在注释中,注释将继续到下一行 - 注释掉 nop 或 call。 (就这样消失不是 nop 的本性!)。丢掉它,或者在它后面放点东西。

——弗兰克·科特勒


来自 NASM 手册,3.1 Layout of a NASM Source Line

NASM 使用反斜杠 (\) 作为行继续符; 如果一行以反斜杠结尾,则下一行被认为是反斜杠结尾行的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多