汇编程序为我的16位代码movzbw ( %ax )抛出错误,%ax错误:‘(%ax)’不是有效的基/索引表达式
但以下指令在32位代码生成中有效。movzbl ( %eax ),%eax
环境:处理器:英特尔(X86)汇编程序:"GNU AS“操作系统:"Linux”目的:当我编写一个非常简单的引导加载程序将"Hello,World“打印到屏幕时,我试图将一个字符串传递给一个函数,然后逐个字节地遍历,然后打印它。
在编写16位实模式代码时,我可以使用什么等效指令来避免错误?
更多信息:下面是我试图在"16位GNU AS“汇编程序中模拟的C代码
void _prints(char*);
int main(void)
{
char* mess = "hello";
_prints(mess);
return 0;
}
void _prints(char* str)
{
while(*str)
{
++str;
}
}注意:在尝试使用命令"movzbl -S test.c“生成汇编文件时,我看到_prints函数中的指令”movzbl (%eax),%eax“。我想使用相同的汇编程序模拟一个16位实模式代码,但它在使用"movzbw (%ax),%ax“时抛出错误。
请帮帮忙
发布于 2013-04-14 16:34:37
在实模式下,(%ax) ([ax])不是有效的间接寻址方法。您必须使用%bp寄存器。我建议你拿起英特尔(或AMD)处理器手册,从前到后阅读第二卷(针对英特尔),就像我做的那样。
如果您只是删除e以模拟实数模式,则没有必要。您的程序不会编译为16位可执行文件。它仍然是使用gcc的32位或64位可执行文件。生成包含16个字符的可执行文件的唯一方法是使用OpenWatcom。即使这样,也不需要编写16位程序。它们很慢,并且在真实模式和保护模式(更改执行线程)之间的切换在处理器上的开销很大。
正如你提到的,这是一个引导加载程序,你不能写这样的引导加载程序。您必须手动编写程序集。据我所知没有例外。
https://stackoverflow.com/questions/15997150
复制相似问题