汇编手册
2025年1月13日大约 2 分钟
速记
sp
指向栈顶bp
为基指针
当基址针被赋予栈顶的值时,会进行新的栈帧创建s[]
:代表内存地址,里面还可以写寄存器。表示寄存器指向的内存地址
arm
函数
lsl 目标寄存器 源寄存器 寄存器或立即数
将源寄存器的值左移立即数位,赋值给目标寄存器sdiv 目标寄存器 源寄存器 寄存器或操作数
将源寄存器的值除以寄存器的值或操作数,赋值给目标寄存器
add
add 目标寄存器 第一个操作数寄存器 第二个操作数寄存器或立即数
存值
str
- str将一个寄存器的值存储到连续的内存地址中
str 寄存器 [寄存器,偏移量]
stp
stp 寄存器1 寄存器2 [存储的内存位置]
- stp将一对寄存器的值存储到连续的内存地址中
tips:若以[内存地址]!
为结尾还可以进行更新栈指针sp
取值
ldr
- 从指定的内存地址取一个双字给予寄存器
无条件跳转
b:无条件跳转到指定的标签或地址
bl:无条件跳转到指定的标签的或地址,并将返回地址保存到链接寄存器LR
中
条件分支
bne:不等于
条件分支
test
指令的行为
如果 EAX 的值为零,
test eax, eax
会使零标志(ZF)被设置为 1。如果 EAX 的值不为零,零标志(ZF)会被清零。
cmp
指令的行为
相减操作:
cmp
指令执行operand1 - operand2
的操作。设置标志位:根据相减的结果设置标志寄存器中的标志位,主要的标志位包括:
ZF(Zero Flag):如果结果为零,则 ZF 设置为 1,否则为 0。
SF(Sign Flag):如果结果为负数,则 SF 设置为 1,否则为 0。
CF(Carry Flag):如果发生借位,则 CF 设置为 1,否则为 0。
OF(Overflow Flag):如果结果溢出,则 OF 设置为 1,否则为 0。
相减的结果会影响这些标志位
常见的条件跳转指令
等于:
je
(Jump if Equal):如果 ZF 为 1,则跳转。
不等于:jne
(Jump if Not Equal):如果 ZF 为 0,则跳转。
大于:jg
(Jump if Greater):如果 SF 为 0 且 ZF 为 0,则跳转。
小于:jl
(Jump if Less):如果 SF 为 1 且 ZF 为 0,则跳转。
大于或等于:jge
(Jump if Greater or Equal):如果 SF 为 0,则跳转。
小于或等于jle
(Jump if Less or Equal):如果 SF 为 1 或 ZF 为 1,则跳转。
标志位存放在标志位寄存器中