首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将32位程序转换为16位程序

将32位程序转换为16位程序
EN

Stack Overflow用户
提问于 2013-04-14 16:29:14
回答 1查看 378关注 0票数 0

汇编程序为我的16位代码movzbw ( %ax )抛出错误,%ax错误:‘(%ax)’不是有效的基/索引表达式

但以下指令在32位代码生成中有效。movzbl ( %eax ),%eax

环境:处理器:英特尔(X86)汇编程序:"GNU AS“操作系统:"Linux”目的:当我编写一个非常简单的引导加载程序将"Hello,World“打印到屏幕时,我试图将一个字符串传递给一个函数,然后逐个字节地遍历,然后打印它。

在编写16位实模式代码时,我可以使用什么等效指令来避免错误?

更多信息:下面是我试图在"16位GNU AS“汇编程序中模拟的C代码

代码语言:javascript
复制
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“时抛出错误。

请帮帮忙

EN

回答 1

Stack Overflow用户

发布于 2013-04-14 16:34:37

在实模式下,(%ax) ([ax])不是有效的间接寻址方法。您必须使用%bp寄存器。我建议你拿起英特尔(或AMD)处理器手册,从前到后阅读第二卷(针对英特尔),就像我做的那样。

如果您只是删除e以模拟实数模式,则没有必要。您的程序不会编译为16位可执行文件。它仍然是使用gcc的32位或64位可执行文件。生成包含16个字符的可执行文件的唯一方法是使用OpenWatcom。即使这样,也不需要编写16位程序。它们很慢,并且在真实模式和保护模式(更改执行线程)之间的切换在处理器上的开销很大。

正如你提到的,这是一个引导加载程序,你不能写这样的引导加载程序。您必须手动编写程序集。据我所知没有例外。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15997150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档