GNU 内嵌汇编入门

2022-01-13  本文已影响0人  wjundong
分类 限定符 描述
通用寄存器 a 将输入变量放入eax
b 将输入变量放入ebx
c 将输入变量放入ecx
d 将输入变量放入edx
s 将输入变量放入esi
d 将输入变量放入edi
q 将输入变量放入eax,ebx,ecx,edx中的一个
r 将输入变量放入通用寄存器,也就是eax,ebx,ecx, edx,esi,edi中的一个
A 把eax和edx合成一个64 位的寄存器(use long longs)
内存 m 内存变量
o 操作数为内存变量,但是其寻址方式是偏移量类型, 也即是基址寻址,或者是基址加变址寻址
V 操作数为内存变量,但寻址方式不是偏移量类型
p 操作数是一个合法的内存地址(指针)
寄存器或内存 g 将输入变量放入eax,ebx,ecx,edx中的一个或者作为内存变量
X 操作数可以是任何类型
立即数 I 0-31之间的立即数(用于32位移位指令)
J 0-63之间的立即数(用于64位移位指令)
N 0-255之间的立即数(用于out指令)
i 立即数
n 立即数,有些系统不支持除字以外的立即数,这些系统应该使用“n”而不是“i”
操作数类型 = 操作数在指令中是只写的(输出操作数)
+ 操作数在指令中是读写类型的(输入输出操作数)
浮点数 f 浮点寄存器
t 第一个浮点寄存器
u 第二个浮点寄存器
G 标准的80387浮点常数
% 该操作数可以和下一个操作数交换位置, 例如addl的两个操作数可以交换顺序 (当然两个操作数都不能是立即数)
# 部分注释,从该字符到其后的逗号之间所有字母被忽略
* 表示如果选用寄存器,则其后的字母被忽略

这里有一个问题:比如使用限定符 "a" 的時候, 假设eax已经被使用,那怎么办? 其实很简单:因为GCC 知道eax 已经被使用,它在这段汇编代码 的起始处插入一条语句pushl %eax,将eax 内容保存到堆栈,然 后在这段代码结束处再增加一条语句popl %eax,恢复eax的内容。

上一篇 下一篇

猜你喜欢

热点阅读