热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计AT&T汇编语法的最初原因是什么?

如何解决《设计AT&T汇编语法的最初原因是什么?》经验,为你挑选了1个好方法。

在x86或amd64上使用汇编指令时,程序员可以使用"Intel"(即nasm编译器)或"AT&T"(即gas编译器)汇编语法."Intel"语法在Windows上更受欢迎,但"AT&T"在UNIX(类似)系统上更受欢迎.

但是英特尔和AMD手册,以及芯片创建者创建的手册都使用"英特尔"语法.

我想知道,"AT&T"语法设计背后的原始想法是什么?浮动处理器创建者使用的符号有什么好处?



1> fuz..:

UNIX很长一段时间是在PDP-11上开发的,这是一台来自DEC的16位计算机,它具有相当简单的指令集.几乎每条指令都有两个操作数,每个操作数可以有以下八种寻址模式之一,这里用MACRO 16汇编语言显示:

0n  Rn        register
1n  (Rn)      deferred
2n  (Rn)+     autoincrement
3n  @(Rn)+    autoincrement deferred
4n  -(Rn)     autodecrement
5n  @-(Rn)    autodecrement deferred
6n  X(Rn)     index
7n  @X(Rn)    index deferred

可以通过巧妙地重用R7(程序计数器)上的一些寻址模式来编码中间地址和直接地址:

27  #imm      immediate
37  @#imm     absolute
67  addr      relative
77  @addr     relative deferred

作为使用UNIX tty驱动@#控制字符,$代替#*@.

PDP11指令字中的第一个操作数是指源操作数,而第二个操作数是指目的地.这反映在汇编语言的操作数顺序中,即源,然后是目标.例如,操作码

011273

指的是指令

mov (R2),R3

它将指向的单词移动R2R3.

此语法适用于8086 CPU及其寻址模式:

mr0 X(bx,si)  bx + si indexed
mr1 X(bx,di)  bx + di indexed
mr2 X(bp,si)  bp + si indexed
mr3 X(bp,di)  bp + di indexed
mr4 X(si)     si indexed
mr5 X(di)     di indexed
mr6 X(bp)     bp indexed
mr7 X(bx)     bx indexed
3rR R         register
0r6 addr      direct

其中m是0,如果没有索引,m是1,如果有一个字节的索引,m是2,如果有一个两字节索引和m为3,如果代替存储器操作数,使用一个寄存器.如果存在两个操作数,则另一个操作数始终是寄存器并以r数字编码.否则,r编码操作码的另外三位.

在该寻址方案中不可能使用中间体,所有采用立即数的指令都在其操作码中编码该事实.Immediates拼写$imm就像在PDP-11语法中一样.

虽然英特尔总是使用dst, src其汇编程序的操作数排序,但没有特别令人信服的理由来适应这种约定,并且编写UNIX汇编程序以使用src, dstPDP11中已知的操作数排序.

他们在实现8087浮点指令时与这种排序有一些不一致,可能是因为英特尔给出了非交换浮点指令的两个可能方向,这些指令与AT&T语法使用的操作数排序不匹配.

PDP11指令jmp(跳转)和jsr(跳转到子程序)跳转到其操作数的地址.因此,jmp foo将跳转到foojmp *foo会跳转到存储在变量的地址foo,类似于如何lea在8086的作品.

x86 jmpcall指令的语法被设计为好像这些指令在PDP11上工作一样,这就是jmp foo跳转到foojmp *foo跳转到地址值的原因foo,即使8086实际上没有延迟寻址.这具有在语法上区分直接跳转与间接跳转的优点和便利,而不需要$每个直接跳转目标的前缀,但逻辑上没有很多意义.

扩展语法以使用冒号指定段前缀:

seg:addr

当引入80386时,该方案使用四部分通用寻址模式适应其新的SIB寻址模式:

disp(base,index,scale)

其中disp是位移,base是基址寄存器,index索引寄存器scale是1,2,4或8,用于按索引寄存器中的一个来缩放索引寄存器.这等于Intel语法:

[disp+base+index*scale]

PDP-11的另一个显着特点是大多数指令都有字节和字变体.您使用哪一个由操作码的后缀bw后缀表示,它直接切换操作码的第一位:

 010001   movw r0,r1
 110001   movb r0,r1

这也适用于AT&T语法,因为大多数8086指令确实也可用于字节模式和字模式.后来80386和AMD K6引入了32位指令(后缀llong)和64位指令(后缀q为quad).

最后但并非最不重要的是,最初的惯例是使用下划线为C语言符号添加前缀(在Windows上仍然如此),因此您可以区分ax从寄存器命名的C函数ax.当Unix系统实验室开发出ELF二进制格式时,他们决定摆脱这种装饰.由于无法区分直接地址和寄存器,否则会%在每个寄存器中添加前缀:

mov direct,%eax # move memory at direct to %eax

这就是我们今天获得AT&T语法的方式.


@BeeOnRope:哦,原来NASM让你写`$ eax`来引用符号`eax`.罗斯回答了我的问题:)
我想NASM至少在这方面是无辜的"可怕的设计".现在,如果他们只修复他们的DWARF信息生成.
推荐阅读
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
手机用户2502903815
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有