|
|
1
6
问题是我没有正确设置描述符表。我有一个位翻转错误,所以我没有进入16位模式,而是改为32位模式(段恰好有一个兆欧的限制)。 谢谢你的建议! 特里 |
|
|
2
4
this link ), “当NASM处于16位模式时,使用32位数据的指令以0x66字节作为前缀,而那些引用32位地址的指令有一个0x67前缀。在位32模式下,情况正好相反:32位指令不需要前缀,而使用16位数据的指令需要0x66,而在16位地址上工作的指令需要0x67。” 这表明是博克斯的错。 |
|
|
3
0
你不是在开玩笑说这是低级的! 您是否检查了生成的操作码/操作数,以确保nasm正确执行您的位指令?还要检查以确保跳转目标是正确的-也许nasm使用了错误的偏移量。 如果不是nasm中的bug,可能bochs中有bug。我无法想象人们会经常从32位模式切换回16位模式。 |
|
|
4
0
如果你在实模式下,你的默认大小是隐式的16位,所以你应该使用16位模式。这样,如果需要32位操作数大小,则添加0x66前缀,而对于32位地址大小,则添加0x67前缀。 请参阅“英特尔IA-32软件开发人员指南”,第3卷,第16章(混合使用16位和32位代码;章节号可能会根据本书的版本更改):
只有在保护模式或长模式之外使用bits32指令时,它才会混淆汇编器。 |