汇编快速认识

作者: | 更新日期:

之前反汇编服务二进制,根据自己的汇编知识找到了问题, 今天记录一下汇编知识.

零、前言

先看一段汇编代码吧.

static inline uint32_t min_cmp_set(volatile int*l, int o, int n) {
	unsigned char r;
	__asm__ volatile (
			"lock;"
			"cmpxchgl  %3, %1;"
			"sete      %0;    "
			: "=a" (r)
			: "m" (*l), "a" (o), "r" (n)
			: "cc", "memory");
	return r;
}

还有下面使用性能工具和反汇编出来的代码.

mov    0x38(%rax),%rdi
mov    $0x1,%esi
add    $0xcf0,%rdi
callq  428
xor    %eax,%eax
add    $0x8,%rsp
retq   
callq  434
mov    0x38(%rax),%rdi
mov    $0x1,%esi
add    $0xc78,%rdi
callq  449
or     $0xffffffffffffffff,%eax
jmp    42a

看第一个代码, 完全不知道什么意思, 看第二个代码,大概能猜出几个意思,但是也不是很确定.
所以我们需要先了解一下汇编的基础知识, 然后就可以轻松的看上面的代码了.

一、寄存器

引用寄存器时在前加百分号,如movl %eax, %ebx
寄存器有这些:

二、基础知识

三、GCC Inline ASM

GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM——GCC内联汇编。 __asm__用来声明一个汇编表达式。
__volatile__ 是可选的,向GCC声明不能对汇编代码进行优化.

__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);
__asm__  __volatile__(指令部:输出部:输入部:损坏部);

1. 解释

2. 约束条件

约束条件 含义如下:

3. 语法规则

后面的部分为空, 后面的冒号可以忽略, 前面的为空,前面的冒号不能忽略.
这个和函数默认参数一个道理,不然没法区分谁是谁了.

另外有冒号了就是C/C++格式的汇编, 没冒号就是内联汇编了. 对于内联汇编访问寄存器使用一个百分号,另一个使用两个.

四、汇编语法

这里只有常见的语法。

五、参考资料

好了, 有了这些基础只是我已经轻松看懂反汇编的所有代码了, 下面是对于的参考资料,ibm的资料果然很全。

六、其他文章

七、关于作者

曾是一名ACMer, 现在是鹅长视频部门的后台开发。
这里主要记录工作中的技术架构与经验,计算机相关的技术,数学、算法、生活上好玩的东西。
长按二维码关注作者, 了解作者发布的最新好玩的东西


长按图片关注公众号, 接受最新文章消息.

点击查看评论

关注公众号,接收最新消息

关注小密圈,学习各种算法

tiankonguse +
穿越