二进制基础

amd64寄存器结构

  • 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:存放当前栈帧的栈顶地址

  • rbp:存放当前栈帧的栈底地址

  • rax:通用寄存器,存放函数返回值

寄存器(64位和32位)

6432
%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

 

 
posted @ 2023-03-20 20:36  白榆-  阅读(74)  评论(0)    收藏  举报