汇编语言快速入门
简介
汇编语言是一种低级编程语言,用助记符(如ADD、MOV)代替二进制机器指令,直接操作硬件。
起源:20世纪50年代(如IBM 704的汇编程序),简化二进制编程的复杂性。
特点:执行高效、贴近硬件,但代码可读性差、可移植性低(依赖特定CPU架构),不区分大小写。
应用:嵌入式系统、驱动开发、性能优化等需直接控制硬件的场景。
现状:虽被高级语言取代主流地位,仍是底层开发和逆向分析的重要工具。
汇编语言的种类
8086汇编(16bit)
x86汇编(32bit)
x64汇编(64bit)
ARM汇编(嵌入式、移动设备)
...
我们这里学习的是x64汇编。
x64根据编译器的不同有两种书写格式(了解)
Intel
AT&T(例如:MacOS,ios)
x64汇编 – 寄存器
64位兼容32位,32位兼容16位,16位兼容8位。(为什么会兼容?以及如何兼容的?可以网上自行搜索,因为太多相关资料,这里不赘述。)
第二张图的寄存器是我们要重点掌握的。
x64汇编要点总结
mov dest, src
将src的内容赋值给dest,类似于dest = src(赋值操作)。
[ 地址值 ]
中括号[ ]里面放的都是内存地址。
word是2字节,dword是4字节(double word),qword是8字节(quad word)
call 函数地址
调用函数
lea dest, [ 地址值 ]
将地址值赋值给dest,类似于dest = 地址值。(指针,或者引用)
ret
函数返回
xor op1, op2
将op1和op2异或的结果赋值给op1,类似于op1 = op1 ^ op2。
add op1, op2
类似于op1 = op1 + op2。
sub op1, op2
类似于op1 = op1 - op2。
inc op
自增,类似于op = op + 1。
dec op
自减,类似于op = op – 1。
jmp 内存地址
跳转到某个内存地址去执行代码。(jmp是无条件跳转)
j开头的一般都是跳转,大多数是有条件(带条件)的跳转,一般跟test、cmp等指令配合使用。
权威参考:Intel白皮书
https://software.intel.com/en-us/articles/intel-sdm
内联汇编
应用场景:有些时候需要直接操作底层硬件,c/c++都无法搞定,就需要用内联汇编。
在程序中使用以下方式写汇编代码。
__asm {
mov eax,10H
mov ebx,20H
}
变量地址总结
一个变量的地址值,是它所有字节地址中的最小值。(变量地址=最小字节地址)