汇编指令和寄存器

寄存器

早期的 x86 CPU 只有 8 个寄存器(eaxebxecxedxesiediebpesp),而且每个都有不同的用途。

寄存器名称 含义 用途 包含寄存器
eax 累加(Accumulator)寄存器 常用于乘除法和函数返回值 axahal
ebx 基址(Base)寄存器 常以它为基址来访问内存 bxbhbl
ecx 计数器(Counter)寄存器 常做字符串和循环操作中的计数器 cxchcl
edx 数据(Data)寄存器 常用于乘除法和 I/O 指针 dxdhdl
esi 来源索引(Source Index)寄存器 常用于内存数据指针和源字符串指针 si
edi 目的索引(Destination Index)寄存器 常用于内存数据指针和源字符串指针 di
ebp 基址指针(Base Pointer)寄存器 只做堆栈指针,可以访问堆栈内任意地址,经常用于中转 ESP 中的数据,也常以它为基址来访问堆栈;不能用于算术运算与数据传送 bp
esp 堆栈指针(Stack Pointer)寄存器 只做堆栈的栈顶指针,不能用于算术运算与数据传送 sp

栈帧中,最重要的是帧指针 ebp 和栈指针 esp,有了这两个指针,我们就可以刻画一个完整的栈帧。

x86-64 中,所有寄存器都是 64 位,相对 32 位的 x86 来说,标识符发生了变化,比如:从原来的 eax 变成了 rax。为了向后兼容性,eax 依然可以使用,不过指向了 rax 的低 32 位。

比如在 64 位 CPU 上:

  • rax 是 64 位的寄存器
  • raxrax 的低 32 位
  • axrax 的低 16 位
  • ahax 的高 8 位。
  • alax 的低 8 位。

它们的对照关系如下:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
|=================================RAX=================================|---8个字节
                                    |===============EAX===============|---4个字节
                                                      |======AX=======|---2个字节
                                                      |==AH===|-----------1个字节
                                                              |===AL==|---1个字节

通过 gdb 的 p /x $reg 命令打印寄存器的值。

(gdb) p /x $rax
$16 = 0x555555554870
(gdb) p /x $eax
$12 = 0x55554870
(gdb) p /x $ax
$13 = 0x4870
(gdb) p /x $ah
$14 = 0x48
(gdb) p /x $al
$15 = 0x70

汇编指令

1. 数据传送指令

指令 名称 语法 描述
mov 数据传送指令 mov dest, src 将数据从 src 移动到 dest
push 入栈指令 push src 将源操作数 src 压入堆栈
pop 入栈指令 pop dest 从栈顶弹出数据到 dest

1.1 mov 指令

mov 指令是最常见的数据传送指令,类似于高级语言中的赋值语句。

mov 指令可以实现寄存器与寄存器之间、寄存器与内存之间、寄存器与立即数、内存与立即数的数据传递。

需要注意的是,内存与内存无法直接传递数据,目的操作数不能为立即数。

mov 指令的用法示例如下:

mov eax, 12345678h
mov eax, [00401000h]
mov eax, ebx
mov [00401000h], 12345678h
mov [00401000h], eax

1.2 pushpop 指令

push 指令和 pop 指令互为相反的操作指令。

  • push 指令的功能是将操作数压入堆栈。
  • pop 指令的功能是将栈顶的操作数弹出。

push 指令把一个 32 位的操作数送入堆栈,该操作致使 esp 寄存器的值减 4。
esp 寄存器始终指向栈顶。堆栈的方向是由高地址向低地址进行延伸,也就是执行的 push 次数越多,esp 寄存器指向的地址越小。
在 32 位平台上,每执行一次 push 指令,esp 指向的地址都减小 4 字节。

pop 指令把 esp 指向地址(栈顶)中的值送入寄存器或内存中,然后 esp 指向的地址加 4 字节。
执行的 pop 指令越多,esp 寄存器指向的地址越大。

(2)算术运算指令

指令 名称 语法 描述
add 加法指令 add dest, src dest 基础上加 src
sub 减法指令 sub dest, src dest 基础上减 src
inc 加 1 指令 inc dest dest 基础上加 1
dec 减 1 指令 dec dest dest 基础上减 1

(3)逻辑运算指令

指令 名称 语法 描述
not 取反运算指令 not dest 把操作数 dest 按位取反
and 与运算指令 and dest, src destsrc 进行与预算之后送回 dest
or 与运算指令 or dest, src destsrc 进行或预算之后送回 dest
xor 与运算指令 xor dest, src destsrc 进行异或预算之后送回 dest

(4)循环控制指令

指令 名称 语法 描述
loop 计数循环指令 loop label 使 ecx 寄存器的值减 1,当 ecx 寄存器的值不为 0 的时候跳转至 lable,否则执行 loop 之后的语句

(5)转移指令

指令 名称 语法 描述
jmp 无条件转移指令 jmp label 无条件跳转至标号为 lable 的位置
call 过程调用指令 call label 直接调用 lable
je 条件转移指令 je label zf = 1 时跳转至标号为 lable 的位置
jne 条件转移指令 jne label zf = 0 时跳转至标号为 lable 的位置

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容