我一直在学习Windows中驱动程序开发的基础知识我一直在寻找Ring 0和Ring 3这两个术语.这些是指什么?它们与内核模式和用户模式相同吗?
谷歌没有显示结果,
有谁知道?
32位寄存器名称以E开头,64位寄存器以R开头.E和R代表什么?是否有理由选择这些字母?
此外,在64位寄存器中,我们也可以在任何低级调试器(如Windbg)中看到,最右边的位仍然用与64位寄存器相同的名称引用,除了名称以E.例如,64位系统中RAX寄存器的最右边32位称为EAX.
那么,E和R代表什么?而且,为什么后缀X用于注册?
首先,什么尺寸eax,ax,ah和同行,在64位架构?如何访问单个寄存器的字节以及如何访问所有64位寄存器的8个字节?
我非常喜欢x86-64(x64)和Itanium处理器.
第二,在新的调用约定中,使用四个寄存器来保存函数调用中前四个参数的正确方法是什么?
我发现这段代码将堆栈指针放入EAX寄存器(它应该是C中“return”使用的寄存器)
#include <stdio.h>
unsigned long get_sp(){
unsigned long stp;
__asm{
mov
eax, esp
}
}
void main(void){
printf("\n0x%x", get_sp());
}
Run Code Online (Sandbox Code Playgroud)
我用 Geany 试过了,但它不起作用!!然后我按照编译器日志,以这种方式更改了代码:
#include <stdio.h>
unsigned long get_sp(void);
int main(void){
printf("\n0x%ld", get_sp());
return 0;
}
unsigned long get_sp(void){
unsigned long stp;
__asm{
mov eax, esp
}
}
Run Code Online (Sandbox Code Playgroud)
这次我的主要功能没有问题,但其他功能是悲剧!!!它无法识别 __asm。未知类型名称 'mov'.... 未使用的变量 'eax'... 似乎它想要 __asm() 而不是 __asm{},就像正常调用函数一样。有人可以帮助我吗?PS 我有 debian 64 ......它可能在 64 架构上有一些问题??
我正在调试我的 x64 c++ 程序以了解它在 x64dbg 中的外观。我在右侧窗口中看到一些 r8-r15 的寄存器,但我没有看到r8d. 还有其他人也有类似的情况r15d。那么它是什么?
AFAIK X86-64增加了大量的通用寄存器的那些从英特尔86(派生rax,rcx等),被称为r8- r15.
他们为什么要这样命名新的寄存器?为什么不遵循现有的命名规则,并呼吁他们一样rfx,rgx...?
我正在尝试学习如何使用汇编语言来改变牌组.我精通java,我可以很容易地将java翻译成C,但我在ASM上遇到了困难.这是我现在遇到的代码块:
MOV R8, [RDI+RSI*4]
MOV R9, [RDI+RDX*4]
MOV [RDI+RSI*4], R9
MOV [RDI+RDX*4], R8
Run Code Online (Sandbox Code Playgroud)
我一直在
error: impossible combination of address sizes
Run Code Online (Sandbox Code Playgroud)
它是用命令运行的
nasm -f elf FILE-NAME.asm
Run Code Online (Sandbox Code Playgroud)
我猜它与我正在使用的寄存器有问题,但我不知道汇编中的规则.我正在学习使用tutorialspoint但是如果有人对其他地方有任何建议我可以更好地学习它,这将是有帮助的.我也在这个答案上看到所有使用的寄存器都有相同的大小,为什么会出错呢?