Assembly NASM/Yasm在注释以反斜杠结尾后放弃调用
我目前正在尝试构建自己的引导加载程序,并注意到一些特殊的东西 当下面的代码在没有标记NOP命令的情况下与NASM或Yasm组合时,二进制文件中缺少以下调用。在包含NOP的情况下,调用已正确组装,但二进制文件中不存在操作码0x90(NOP)(由于NOP的性质,后面可以理解)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
到_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