逆向基础 杂谈一

问题一:16位、32位、64位操作系统有几个寄存器,分别是什么作用。

16 位CPU 所含有的寄存器共有14个:
4 个数据寄存器(AX 、BX 、CX 和DX)
2 个变址和指针寄存器(SI 和 DI) 2 个指针寄存器(SP堆栈指针寄存器和BP基指针寄存器)
4 个段寄存器(CS、DS、ES、SS)
1 个指令指针寄存器(EIP) 1 个标志寄存器(EFlags)

32 位CPU 所含有的寄存器共有16个:
4 个数据寄存器(EAX 、EBX 、ECX 和EDX)
2 个变址和指针寄存器(ESI 和 EDI) 2 个指针寄存器(ESP堆栈指针寄存器和EBP基指针寄存器)
6 个段寄存器(CS 、DS 、ES 、SS和GS 、FS)
1 个指令指针寄存器(EIP) 1 个标志寄存器(EFlags)

64 位CPU 所含有的寄存器共有24个:
4 个数据寄存器(RAX 、RBX 、RCX 和RDX)
2 个变址和指针寄存器(RSI 和 RDI) 2 个指针寄存器(RSP堆栈指针寄存器和RBP基指针寄存器)
8 个寄存器(R8 、R9 、R10 、R11 、R12 、R13 、R14 、R15)
6 个段寄存器(CS 、DS 、ES 、SS和GS 、FS)
1 个指令指针寄存器(EIP) 1 个标志寄存器(EFlags) 
段寄存器:
CS:代码段寄存器 ES:附加段寄存器
DS:数据段寄存器 FS:附加段寄存器
SS:堆栈段寄存器 GS:附加段寄存器

在这里插入图片描述

img

32位地址注意事项:
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为偏移地址的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一个组成部分。
比如,指令:mov ebx, [eax+edx*2300]
eax就是基址寄存器,edx就是变址寄存器,300H就是偏移常量。
注意:
    地址中寄存器的书写顺序决定该寄存器是基址寄存器还是变址寄存器。如:[ebx+ebp]中的ebx是基址寄存器,ebp是变址寄存器,而[ebp+ebx]中的ebp是基址寄存器,ebx是变址寄存器,可以看出,左边那个是基址寄存器,另一个是变址寄存器。
    默认段寄存器的选用取决于基址寄存器。
    基址寄存器是ebp或esp时,默认的段寄存器是SS,否则,默认的段寄存器是DS。
    在指令中,如果显式地给出段寄存器,那么显式段寄存器优先。
64位地址注意事项:
    64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。
    32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值
    64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用
    64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式。

参考链接:
https://blog.csdn.net/Yun_Ge/article/details/85158670
https://blog.csdn.net/qq_29343201/article/details/51278798

 

问题二:调用方式有哪些:

参考链接:

https://www.cnblogs.com/songyaqi/p/12075105.html

 

问题三:RET、CALL、POP EIP、PUSH EIP的区别联系

CALL:

1、向堆栈中压入下一行程序的地址
2、JMP到call的子程序地址处
1、push eip
2、jmp address

RET:

1、向堆栈中压入下一行程序的地址
2、JMP到call的子程序地址处
1、pop eip
2、jmp address

 

问题四:堆栈平衡原理

如果要返回父程序,则当我们在 堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址

参考链接:https://blog.csdn.net/Fiverya/article/details/79176124

 

posted @ 2021-03-13 10:27  瑞皇  阅读(109)  评论(0编辑  收藏  举报