百科问答小站 logo
百科问答小站 font logo



汇编语言转换成机器语言,具体在机器这个层面是如何实现的? 第1页

  

user avatar   s.invalid 网友的相关建议: 
      

不考虑宏汇编的话,大概是这个样子:

       map<string, string> 助记符到指令码 = {    {"nop", "90"},    {"mov", "56"},    {"$1", "00$1"},    {"[$1]", "01$1"},    ... }      

然后你就可以写汇编程序了:

       nop nop mov ax,bx mov [ax],bx     

然后就是依照那个map做简单的字符串替换了。比如见了nop就替换成16进制的90,见了mov就替换成16进制的56;后面的ax/bx在指令中替换成寄存器地址即可;参数带不带中括号意味着它是指针访问还是直接取值,所以要酌情加不同的指示标志(比如我杜撰的这种语言,00是作为值直接访问,01就是当成地址间接访问)……


注意,不同汇编器支持的助记符写法风格不同。你完全可以自己随便约定。另外,不同CPU的指令构成也不尽相同,你也要自己抓住其中的规律,然后总结出字符串替换规则——但总而言之就是字符串替换而已,没什么特别的。


当然,不同系统可能会规定不同的可执行文件格式。比如Linux系统和Windows系统就不一样;当年dos系统下的command文件和exe也不相同。

总的来说,你需要按照人家的规矩填充一个叫“文件头”的数据结构,然后按规矩在正确位置放置第一条指令(的机器码);此外,你可能需要为“重定位”支持稍微多做一点小小的工作、并且算一算标号(label)的相对地址,再把它替换进相关指令中。


但归根结底,汇编到机器语言基本就是一个字符串替换的工作,没什么神秘的——编译原理这种大杀器在“高级语言编译到汇编”这种场景才能派上用场,汇编器这种小打小闹还用不着它。




  

相关话题

  和亲戚借30w去美国留学合适吗? 
  为什么现在网上普遍低估公务员的收入? 
  近几年有哪些关于机器学习中隐私(Privacy)和安全(Security)相关的研究值得关注? 
  学编译原理有什么好书? 
  计算机图形学毕业生怎么这么少啊? 
  如何看待方舟编译器于 2019 年 8 月 31 日开源? 
  为什么许多人建议本科学数学,研究生阶段转金融或者计算机?学数学的发展方向只有纯数学计算机以及金融吗? 
  C++对比其他语言到底难在哪里?有人对C++异常推崇,除了性能优势,还有什么优点,怎么学好C++? 
  为什么身边的人都想学计算机,计算机真的有那么好吗? 
  一名大二的计算机专业的学生,目前学了很多编程语言,但都学得很浅。是不是应该专攻一门感兴趣的语言? 

前一个讨论
为什么在汇编语言中需大量使用跳转指令,而在C语言中却尽量避免使用goto语句呢?
下一个讨论
野生动物直接喝浑浊的脏水都没事,为什么人类不行?





© 2025-04-03 - tinynew.org. All Rights Reserved.
© 2025-04-03 - tinynew.org. 保留所有权利