DEV Community

Tim Jan
Tim Jan

Posted on

Assembly-instruction

语法:操作码/指令/助记符 目标操作数(operand),源操作数

  • 立即数(IM):不是寄存器或内存地址,硬编码常量数据;如5,10等

  • registry:寄存器,存储指针或数据(cpu内)

  • 内存地址:如0x7FFF842B.

常用指令:
mov,
LEA is short for Load Effective Address
push
POP
INC
DEC
ADD:add RAX, RBX
SUB:sub RAX, RBX
乘除: 上半部分存在RDX,下半部分在RAX;RDX:RAX;mul(无符号),imul(有符号);div,idiv

  • 流程控制: RET is short for return, mov RAX, 10 ret ;等价于return 10 ;CMP(compare),JCC instructions(conditional jumps,基于flags):有JNE, JLE, JNZ...(对应高级语言中的IF);NOP 如 mov RAX, 25 mov RBX, 5 mul RBX ; Multiplies RAX (25) with RBX (5)

mov RAX, 18
mov RBX, 3
div RBX ; Divides RAX (18) by RBX (3)

区别:

  1. ✅ mov rax, [struct+8] 先计算地址 struct起始地址 + 8,再读取该内存地址里存储的值送入 rax。
  2. ✅ lea rax, [struct+8] lea 不会解引用!只单纯计算有效地址。

pointers

关键符号

  1. []:解引用即如[var],访问指针var在内存中保存的值
  2. LEA :[]在其中不解引用 例子

zero extension零扩展

-

mov eax, 0x1234

CPU自动将高32位归零,最终完整 64 位 RAX = 0x000000001234;但写入16位/8位子寄存器不会自动零扩展

JMP's Mason(跳转临界边界问题)

rax = struct起始地址 + 8,得到偏移 8 字节的成员地址,不取内存数据。

Top comments (4)

Collapse
 
call_me_sin profile image
Tim Jan


Collapse
 
call_me_sin profile image
Tim Jan

Collapse
 
call_me_sin profile image
Tim Jan

Collapse
 
call_me_sin profile image
Tim Jan

R8、R9 是 x86-64(AMD64)新增通用寄存器
用R8举例,R9相同:
R8:64 位完整寄存器
R8D:低 32 位(写入会自动清空高 32 位)
R8W:低 16 位
R8B:最低 8 位