Assembly NASM/Yasm在注释以反斜杠结尾后放弃调用

Assembly NASM/Yasm在注释以反斜杠结尾后放弃调用,assembly,nasm,yasm,intel-syntax,Assembly,Nasm,Yasm,Intel Syntax,我目前正在尝试构建自己的引导加载程序,并注意到一些特殊的东西 当下面的代码在没有标记NOP命令的情况下与NASM或Yasm组合时,二进制文件中缺少以下调用。在包含NOP的情况下,调用已正确组装,但二进制文件中不存在操作码0x90(NOP)(由于NOP的性质,后面可以理解) 到_hex_ascii: 添加al,“0” cmp-al,0x3a jl.完 ; 添加al,0x07 添加al,0x27 (完) ret 打印单词十六进制: 推动bp 莫夫英国石油公司 mov dx,[bp

我目前正在尝试构建自己的引导加载程序,并注意到一些特殊的东西

当下面的代码在没有标记NOP命令的情况下与NASM或Yasm组合时,二进制文件中缺少以下调用。在包含NOP的情况下,调用已正确组装,但二进制文件中不存在操作码0x90(NOP)(由于NOP的性质,后面可以理解)

到_hex_ascii:
添加al,“0”
cmp-al,0x3a
jl.完
;           添加al,0x07
添加al,0x27
(完)
ret
打印单词十六进制:
推动bp
莫夫英国石油公司
mov dx,[bp+4]
推送dx
莫夫艾尔,dh
推斧\
没有

反斜杠字符“\”,作为行上的最后一个字符,是Nasm的“行连续字符”。通过将其放入注释中,注释将继续到下一行-注释nop或呼叫。(nop的本质不是像那样消失!)。丢了它,或者把东西放在后面

–弗兰克·科特勒


根据NASM手册:

NASM使用反斜杠(
\
)作为行连续字符如果一行以反斜杠结束,则下一行将被视为反斜杠结束行的一部分。


反斜杠字符“\”,作为行上的最后一个字符,是Nasm的“行连续字符”。通过将其放入注释中,注释将继续到下一行-注释掉
nop
call
。(像那样消失不是
nop
的本质!)。是的,所以当你删除
nop
行时,
call
会被注释掉。啊,没想到,谢谢;遵守C调用约定(并在堆栈上传递参数,而不是在寄存器中传递参数,以及玩弄“堆栈帧指针”)是汇编语言程序员的标志,他们永远无法将所需的一切都放入“<512字节”引导加载程序中
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