相关疑难解决方法(0)

引用内存位置的内容.(x86寻址模式)

我有一个内存位置,其中包含一个我想要与另一个角色进行比较的角色(并且它不在堆栈的顶部,所以我不能只是pop它).如何引用内存位置的内容以便进行比较?

基本上我如何在语法上做到这一点.

x86 assembly masm addressing-mode

4
推荐指数
1
解决办法
6687
查看次数

在不是地址/指针的值上使用LEA?

我试图了解地址计算指令的工作原理,尤其是leaq命令.然后当我看到leaq用于进行算术运算的例子时,我感到困惑.例如,以下C代码,

long m12(long x) {
return x*12;
}
Run Code Online (Sandbox Code Playgroud)

在组装中

leaq (%rdi, %rdi, 2), %rax
salq $2, $rax
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,那么leaq应该移动任何(%rdi, %rdi, 2)应该2*%rdi+%rdi评估的地址%rax.我感到困惑的是,因为值x存储%rdi在内,这只是内存地址,为什么%rdi乘以3然后左移这个内存地址 2等于x乘以12?是不是当我们%rdi用3时,我们跳到另一个没有值x的内存地址?

c x86 assembly memory-address

4
推荐指数
2
解决办法
4927
查看次数

如何用 fs 和 gs 寄存器计算有效地址

在 x86_64 中,fs 和 gs 寄存器涉及有限形式的分段。就以fs为例,fs寄存器、FSBase MSR是如何协同工作生成有效地址的呢?

如果我更改 fs 基数而不更改 fs,会发生什么情况?还是更改 fs 基础会自动更改 fs?

如果我更改 fs 寄存器而不更改 fs 基数会怎样?如何影响有效地址计算?

我们可以举一个简单的例子

mov %fs:(%eax), %ebx
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 cpu-registers memory-segmentation addressing-mode

3
推荐指数
1
解决办法
677
查看次数

段寄存器如何参与内存地址转换?

在我迄今为止学到的关于分割的内容中:

  • 虚拟地址包含段选择器和偏移量
  • 段选择器与GDTR结合使用以查找段描述符的线性地址
  • 段描述符包含有关所选段的信息,包括其线性地址

所以,我的问题是:

  • 基于我所读到的内容,虚拟地址被加载到段寄存器中,然后以某种方式从那里继续转换.在将虚拟地址加载到其中以获取描述符后,段寄存器会发生什么?

  • 据我了解,段寄存器还包含描述符的缓存值.这在翻译过程中如何发挥作用?

  • 系统如何确定要加载哪个段寄存器,假设段选择器最多可以有2 ^ 13个不同的值且只有6个主寄存器?

hardware x86 x86-64 intel cpu-registers

0
推荐指数
1
解决办法
405
查看次数