返回信息流# 汇编中include的顺序问题
刚学汇编,自己在写bootloader时,发现 include 的顺序会影响可执行文件
我在切换 `real mode` 和 `protect mode` 时,
当先include switch.asm 后include print.asm 时,会print一些未被定义的字符
当include的修改顺序后,发现 print 输出的内容正常了
不太懂为什么,网上查了一下但是没有找到合适的解释,求大佬解惑
这是一条镜像帖。来源:北邮人论坛 / cpp / #100391同步于 2020/10/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
汇编中include的顺序问题
wangha
2020/10/29镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 nitroethane 的大作中提到: 】
: 如果说 include 的顺序会影响编译结果,那说明你的代码写的有问题。不贴代码和报错怎么知道问题
没有报错,是会不停输出'S'
代码的话,我贴在了这里
<https://paste.ubuntu.com/p/Nnw8qQsJKt/>
如何复现?
将代码16行和18行交换
即
'''
%include "../libprint.asm"
%include "./gdt_32bits.asm"
%include "./switch.asm"
%include "./print_pm.asm"
'''
===
'''
%include "./switch.asm"
%include "./gdt_32bits.asm"
%include "../libprint.asm"
%include "./print_pm.asm"
'''
【 在 shengg 的大作中提到: 】
: 没写过汇编。看到libprint.asm和gdt_32bits.asm里面没有写[bits 32]这个东西,不知道有没有关系?
boommmm!!!!
非常感谢,问题就是出在了这儿
这似乎是我的一个华点,于是我仔细去检查了一下,并了解到[bits 32]会指定接下来的指令将会在32位模式下执行,主要涉及到的可能是一些寄存器中的赋值或者操作等(手册中说,默认是16位下工作,但还是和编译器的参数和可能的优化有关)
在libprint.asm中,没有指定工作模式,因此我以为他会按照缺省情况下在16位下工作,下面的指令应该不会有啥问题,但是当我主动声明[bits 16]后,错误消失了
[ema41]