C 指针原理揭秘:基于底层实现机制 (16):AT&T 汇编概述 3.1.3

阅读数:8 2019 年 12 月 11 日 20:21

C指针原理揭秘:基于底层实现机制(16):AT&T汇编概述 3.1.3

(AT&T 汇编语言的特点)

内容简介
全书分为准备篇、基础篇、揭秘篇、实战篇。本书力求从底层实现机制进行解析,同时配合 C/C++ 编程技巧以及某些指针运用技巧,讲解如何提高程序效能,如何避免滥用指针。
准备篇中介绍 C 指针概述、UBUNTU 及开发环境配置、AT&T 汇编简介、编译原理基础;基础篇将对 AT&T 汇编以及 C 指针基础进行介绍;揭秘篇讲述高级 C 指针的实现机制以及 C++ 指针实现机制,同时讲解编程技巧和 C/C++ 指针高级应用;实战篇讲解解释语言指针、TCC 编译实践、垃圾回收等高级 C 指针应用话题。

汇编语言允许程序员方便地创建指令码程序,但不是用那些二进制编码的格式,而是使用助记符,助记符使用不同的单词表示不同的指令码。有了助记符,程序员可以用英语来编写在目标机器上执行的指令码,而不用记忆那些无趣的二进制编码。

绝大多数程序员以前只接触过 DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的,在 Linux 系统中,更多采用的还是 AT&T 汇编语言,因此,本书将以 AT&T 汇编语言为例进行讲解。

AT&T 汇编语法主要包含如下特点。

1)程序源文件一般以“.s”作为后缀文件名,以“#”开头表示注释。

2)寄存器名以“%”作为前缀。例如,下面的代码表示将 eax 寄存器的内容复制到 ebx 中:

复制代码
movl %eax,%ebx

3)立即操作数以“$”前缀表示。例如,下面的代码表示将 1 复制到 eax 内存地址中(eax 用括号包围,表示操作数的内存位置,而不是操作数本身):

复制代码
movl $1, (%eax)

4)目标操作数在源操作数的右边。例如,下面的代码表示将寄存器 eax 的内容复制到 ebx 中:

复制代码
movl %eax,%ebx

5)操作数的字长由操作符的最后一个字母决定,后缀“b”、“w”、“l”分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32 比特)。

下面以复制指令 mov 为例进行说明。

movl 对 32 位进行操作,下面的代码表示将 eax 寄存器 32 位的内容复制到 ebx 中:

复制代码
movl %eax, %ebx

movw 对 16 位进行操作,下面的代码表示将 ax 寄存器的内容复制到 bx 中:

复制代码
movw %ax, %bx

movb 对 8 位进行操作,下面的代码表示将 al 寄存器的内容复制到 bl 中:

复制代码
movb %al, %bl

下面再来看一下入栈指令 push(如下面的代码所示,“#”后的注释是对本行代码的说明):

复制代码
pushl %ecx # 32 位 ecx 的内容入栈
pushw %cx # 16 位 ecx 的内容入栈
pushl $180 # 180 作为一个 32 位整数入栈
pushl data # data 变量内容入栈,长度为 32
pushl $data # 这个操作很特别,在变量前面加上 "$" 表示获取变量的地址,这里是将 data 变量的地址入栈

6)远程转移指令和远程子调用指令的操作码分别为 ljump 和 lcall。

C指针原理揭秘:基于底层实现机制(16):AT&T汇编概述 3.1.3

购书地址 https://item.jd.com/12533413.html?dist=jd

评论

发布