问题标签 [addressing-mode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
12492 浏览

assembly - MIPS寻址模式中寄存器间接和基数加偏移之间的区别?

寄存器间接基数加偏移之间有什么区别,它如何影响您在 MIPS 架构上编写程序集的方式?我认为这意味着您只能在指令中引用寄存器,而该寄存器必须指向更多指令?

0 投票
1 回答
507 浏览

assembly - 汇编堆栈索引地址

我正在尝试使用 ollydbg 调试程序,但我怀疑使用 SS 前缀索引模式地址。

这是一个屏幕截图:

此时,指令

会将 8 位移至减去 1 后EBX指向的地址。EBP(0012FDCC)0012FDCB

如果以上不正确,请告诉我。

在 ollydbg 程序中,右下角有一个堆栈的表示,第一列是地址。为什么没有指向0012FDCBwhere的入口?0012FDCB

0 投票
3 回答
17710 浏览

assembly - ARM 程序集:存储中的自动递增寄存器

是否可以使用 STR 自动增加寄存器的基地址[Rn]!?我浏览了文档,但未能找到明确的答案,主要是因为 LDR 和 STR 都提供了命令语法 - 理论上它应该适用于两者,但我找不到 auto 的任何示例- 增加商店(加载正常)。

我做了一个小程序,将两个数字存储在一个向量中。完成后,out应该是的内容,{1, 2}但存储会覆盖第一个字节,就好像自动增量不起作用一样。


编辑:虽然答案对于常规加载和存储是正确的,但我发现优化器会弄乱 vldm/vstm 等向量指令的自动增量。例如下面的程序

编译

将在最后 8 个变量的输出上产生乱码,因为优化器会保留递增的变量并将其用于 printf。换句话说,out[i]is 实际上out[i+8],所以前 8 个打印值是向量中的最后 8 个值,其余的是超出范围的内存位置。

我已经尝试在volatile整个代码中使用不同的关键字组合,但是只有当我使用-O0标志编译或者我使用 volatile 向量而不是指针和 new 时,行为才会改变,比如

0 投票
2 回答
9486 浏览

assembly - 汇编程序在 GDT 的保护模式下跳转

我目前正在玩 x86 Assember,以提高我的低级编程技能。目前,我在 32 位保护模式下的寻址方案面临一个小问题。

情况如下:

我在 0x7e0 加载了一个程序,它将 CPU 切换到保护模式并跳转到代码中的相应标签:

到目前为止,这工作得很好。“jmp ProtectedMode”在没有明确的远跳转来清除预取队列的情况下工作 - 因为这个程序加载了偏移量 0(开头的 org 0) - 导致代码段指向正确的位置。

我现在当前的问题是,在“ProtectedMode”标签中,我想跳转到另一个在 0x8000 加载的程序(我用内存转储检查了这个,加载功能确实工作正常并且程序正确加载到 0x8000) .

由于 CPU 现在处于 ProtectedMode 而不是 RealMode,因此寻址模式不同。ProtectedMode 使用描述符选择器在描述符表中查找基地址和限制,以添加给定的偏移量并检索物理地址(据我所知)。因此,在进入 ProtectedMode 之前必须安装 GDT。

我的看起来像下面这样:

并通过加载到 GDT 寄存器

到目前为止我不明白的是,我现在如何使用 GDT 在 ProtectedMode 中跳转到物理地址 0x8000?

我的第一个想法是选择应该指向 0x7e00(当前程序是否已加载)的代码描述符(CODE_DESC)并使用到达 0x8000(512 字节)所需的偏移量,从而产生跳转指令:

但这不起作用。

也不起作用...

你知道我在这里想念什么吗?也许我不了解 32 位保护模式寻址方案和 GDT 的使用中的一些基本内容。

[编辑] 完整代码:

0 投票
2 回答
25490 浏览

assembly - lea 汇编指令

我只是想确保我读的是正确的:

我将第一行读为:edx = [epb + 12],第二行读为:eax = edx + edx*4

有人可以澄清吗?

另外,如果我有以下两行怎么办:

一旦执行了第二行,eax寄存器会被覆盖吗?

并且eax = edx + edx*4是将地址乘以4?还是地址内容减4?

0 投票
1 回答
2520 浏览

assembly - x86 lea 指令

我试图很好地掌握 x86 中的 LEA 指令:

鉴于这两行,我知道:

eax = edx + edx*4

进而

eax = edx + edx*2

两个问题。首先,如果这些指令像本例中那样按顺序出现,那么一旦执行第二行,eax 寄存器就会被覆盖?究竟什么会被加载到寄存器中?另一个地址?或者这是对这些寄存器指向的值进行算术运算?

0 投票
7 回答
27806 浏览

assembly - 在 x86-64 AT&T 程序集中,地址前的星号 * 是什么意思?

以下行是什么意思:

内存地址前面的星号是什么意思?另外,当内存访问方法缺少它的第一个寄存器值时,这意味着什么?

通常它类似于 ("%register", %rax, 8),但在这种情况下它没有第一个寄存器。

有小费吗?

0 投票
1 回答
854 浏览

assembly - 这种 x86 寻址模式如何工作?

像 al 这样的东西会包含 esi + ecx + 1 的地址吗?

0 投票
1 回答
4000 浏览

assembly - 汇编代码和“lea”中的地址

如果我说:

我被教导它本质上意味着:

这个格式是如何工作的?

我想这会导致第二个问题。如果我有这样的事情:

我知道第一个操作数被添加到第二个操作数,然后存储在第二个操作数中,但同样,我不明白的是第一个操作数的符号。另一个例子是如果我有:

...,这是否意味着正在将 %eax 的值与以下值进行比较:

...?我尝试搜索了很多这样的东西,但我想我没有使用正确的词来找到有意义的答案,所以我决定在这里发帖。

0 投票
1 回答
120 浏览

x86 - 在 Linux 中从 IA32 访问操作数和操作

我对我必须为大学做的这项家庭作业感到有些困惑,我了解寄存器是什么,为什么要在内存或寄存器中放置一些字节,但对我推动这一点会有很大帮助第一个练习:

(Gnu 组装):

用指示的操作数的相应值填写下表:

通过查看,我可以看出第一个操作数的十六进制值为0x100并且是一个寄存器,第二个我无法分辨,因为之前没有,第三个操作数有一个美元标志,我读到它是一个立即数操作数,无法判断它得到什么值。

4(%eax) 它可能是一个内存地址,其中 4 是位移,从这一点上我不知道......

我希望我尽可能清楚地了解我的疑问,并非常感谢您提供的任何帮助。

亲切的问候,苏萨。