二进制基础
-
rax:8 bytes
-
eax:4 bytes
-
ax:2 bytes
-
ah:1 byte
-
al :1 bytes
部分寄存的功能:
-
eax:累加器
-
ebx:基址寄存器
-
ecx:计数器寄存器
-
edx:数据寄存器-可用于I/O端口访问和算术函数
-
esi:源索引寄存器
-
edi:目标索引寄存器
-
rip:存放当前执行的指令的地址
-
rsp:存放当前栈帧的栈顶地址
-
-
rax:通用寄存器,存放函数返回值
寄存器(64位和32位)
| 64 | 32 |
|---|---|
| %rax | %eax |
| %rbx | %ebx |
| %rcx | %ecx |
| %rdx | %edx |
| %rsi | %esi |
| %rdi | %edi |
| %rbp | %ebp |
| %rsp | %esp |
| %r8 | %r8d |
| %r9 | %r9d |
| %r10 | %r10d |
| %r11 | %r11d |
| %r12 | %r12d |
| %r13 | %r13d |
| %r14 | %r14d |
| %r15 | %r15d |
段寄存器
| 段寄存器 | 偏移地址寄存器 |
|---|---|
| CS: | IP |
| DS: | 用户给出 |
| ES: | 用户给出 |
| SS: | SP |
汇编基础
基础指令
| 序号 | 命令 | 举例 | 说明 |
|---|---|---|---|
| 1 | mov | mov rax,rbx | 将rbx中的值赋值给rax |
| movzx | movzx eax,BYTE PTR [ rbp-0x10] | 把 rbp-0x10的第一位给eaxBYTE WROD DWORD QWORD 8位 16位 32位 64位 | |
| 2 | add | add rax,rbx | 将 rax+rbx 赋值给rax |
| 3 | sub | sub rax,rbx | 将 rax-rbx 赋值给rax |
| 4 | cmp | cmp al,0x61 | 相当于 al - 0x61跟sub的差别是没有赋值给 al例:运用在 je 之前为判断是否相同 |
| 5 | lea | lea rax,[ rbp-0x18 ] | 将rbp - 0x18 赋值给rax若用sub、mov sub rbp,0x18 mov rax,rbp将1和2进行对比,发现1更短 |
| 6 | rep |
跳转(以 j 开头的操作码)
| 序号 | 命令 | 说明 | 标记位 |
|---|---|---|---|
| 1 | JE,JZ | 结果为零则跳转(相等时跳转) | ZF = 1 |
| 2 | JNE,JNZ | 结果不为零则跳转(不相等时跳转) | ZF = 0 |
| 3 | JS | 结果为负则跳转 | SF = 1 |
| 4 | JNS | 结果为非负则跳转 | SF = 0 |
| 5 | JP,JPE | 结果中1的个数为偶数则跳转 | PF = 1 |
| 6 | JNP,JPO | 结果中1的个数为偶数则不跳转 | PF = 0 |
| 7 | JO | 结果溢出了则跳转 | OF = 1 |
| 8 | JNO | 结果没有溢出则跳转 | OF = 0 |
| 9 | JB,JNAE | 小于则跳转(无符号数) | CF = 1 |
| 10 | JNB,JAE | 大于等于则跳转(无符号数) | CF = 0 |
| 11 | JBE.JNA | 小于等于则跳转(无符号数) | CF = 1 or ZF = 1 |
| 12 | JNBE,JA | 大于则跳转(无符号数) | CF = 0 and ZF = 0 |
| 13 | JL,JNGE | 小于则跳转(有符号数) | SF ≠ OF |
| 14 | JNL,JGE | 大于等于则跳转(有符号数) | SF = OF |
| 15 | JLE,JNG | 小于等于则跳转(有符号数) | ZF ≠ 1 or SF ≠ OF |
| 16 | JNLE,JG | 大于则跳转(有符号数) | ZF = 0 and SF = OF |
gcc编译
#gcc编译32位程序
sudo apt-get install gcc-multilib g++-multilib module-assistant#gcc编译x86gcc -m32 question_1.c -o question_1_x86#gcc编译64位程序gcc question_1.c -o questioin_1_x64

浙公网安备 33010602011771号