网站设计行业前景,重庆营销型网站建设沛宣,wordpress不用ftp下载文件,延庆营销型网站建设GNU 汇编器是 GNU 二进制实用程序 (binutils) 的一部分#xff0c;也是 GNU 编译器集合的后端。尽管 as 不是编写相当大的汇编程序的首选汇编程序#xff0c;但它是当代类 Unix 系统的重要组成部分#xff0c;特别是对于内核级黑客攻击。 经常因其神秘的 ATT 风格语法而…GNU 汇编器是 GNU 二进制实用程序 (binutils) 的一部分也是 GNU 编译器集合的后端。尽管 as 不是编写相当大的汇编程序的首选汇编程序但它是当代类 Unix 系统的重要组成部分特别是对于内核级黑客攻击。 经常因其神秘的 ATT 风格语法而受到批评有人认为as 的编写重点是用作 GCC 的后端而很少关心“开发人员友好性”。 如果您是一位来自 INTEL 语法背景的汇编程序员您将在代码可读性和代码生成方面遇到一定程度的窒息。 然而必须指出的是许多操作系统的代码库依赖于汇编器来生成低级代码。
1. 基本格式 ATT 语法中的程序结构与任何其他汇编器语法类似由一系列伪指令(directives)、标签(labels)、指令(instructions)组成——由助记符和最多三个操作数组成。 ATT 语法中最显著的差异源于操作数的顺序(注与intel格式汇编语法刚好相反)。 例如通用的基本数据移动指令intel汇编语法是
助记符(mnemonic) 目标操作数(destination) 源操作数(source)
而ATT汇编语法则是
助记符(mnemonic) 源操作数(source) 目标操作数(destination)
对于某些人来说这种格式更直观。以下部分描述了 X64 架构的 ATT 汇编指令的操作数类型。
例如
instr source,dest
movl (%ecx),%eax (括号()表示取地址相当于intel格式的[%ecx])
movb %bl,%al
movw %bx,%ax
movl %ebx,%eax
movl (%ebx),%eax 2. 寄存器 ATT语法要求在指令后面加上后缀表示长度根据操作的是1字节、2字节、4字节、8字节分别对应后缀b(byte), w(word,一个字即16字节), l(long word即双字), q(quad word,四字即64字节)不加后缀默认是w。 X64的所有寄存器都带前缀符号‘%’ 例如%rax,%rbx, %rcx等等。例如
movq %rax, %rbx ;(movq的q指quadword即4字1个字16字节) 例如 movl $1,%eax
movl $0xff,%ebx
int $0x80 3. 文字量(literal values) 所有文字量必须带前缀符号‘$’,例如
movw $100, %bx
movb $0x0A, %al
注意使用gcc 嵌入汇编译时‘%’号要使用两个‘%%’。
例如
__asm__ __volatile__ (movw $100, %%bx : b(a));