问题标签 [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.
assembly - MIPS寻址模式中寄存器间接和基数加偏移之间的区别?
寄存器间接和基数加偏移之间有什么区别,它如何影响您在 MIPS 架构上编写程序集的方式?我认为这意味着您只能在指令中引用寄存器,而该寄存器必须指向更多指令?
assembly - 汇编堆栈索引地址
我正在尝试使用 ollydbg 调试程序,但我怀疑使用 SS 前缀索引模式地址。
这是一个屏幕截图:
此时,指令
会将 8 位移至减去 1 后EBX
指向的地址。EBP(0012FDCC)
0012FDCB
如果以上不正确,请告诉我。
在 ollydbg 程序中,右下角有一个堆栈的表示,第一列是地址。为什么没有指向0012FDCB
where的入口?0012FDCB
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 时,行为才会改变,比如
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 的使用中的一些基本内容。
[编辑] 完整代码:
assembly - lea 汇编指令
我只是想确保我读的是正确的:
我将第一行读为:edx = [epb + 12]
,第二行读为:eax = edx + edx*4
有人可以澄清吗?
另外,如果我有以下两行怎么办:
一旦执行了第二行,eax
寄存器会被覆盖吗?
并且eax = edx + edx*4
是将地址乘以4?还是地址内容减4?
assembly - x86 lea 指令
我试图很好地掌握 x86 中的 LEA 指令:
鉴于这两行,我知道:
eax = edx + edx*4
进而
eax = edx + edx*2
两个问题。首先,如果这些指令像本例中那样按顺序出现,那么一旦执行第二行,eax 寄存器就会被覆盖?究竟什么会被加载到寄存器中?另一个地址?或者这是对这些寄存器指向的值进行算术运算?
assembly - 在 x86-64 AT&T 程序集中,地址前的星号 * 是什么意思?
以下行是什么意思:
内存地址前面的星号是什么意思?另外,当内存访问方法缺少它的第一个寄存器值时,这意味着什么?
通常它类似于 ("%register", %rax, 8),但在这种情况下它没有第一个寄存器。
有小费吗?
assembly - 这种 x86 寻址模式如何工作?
像 al 这样的东西会包含 esi + ecx + 1 的地址吗?
assembly - 汇编代码和“lea”中的地址
如果我说:
我被教导它本质上意味着:
这个格式是如何工作的?
我想这会导致第二个问题。如果我有这样的事情:
我知道第一个操作数被添加到第二个操作数,然后存储在第二个操作数中,但同样,我不明白的是第一个操作数的符号。另一个例子是如果我有:
...,这是否意味着正在将 %eax 的值与以下值进行比较:
...?我尝试搜索了很多这样的东西,但我想我没有使用正确的词来找到有意义的答案,所以我决定在这里发帖。
x86 - 在 Linux 中从 IA32 访问操作数和操作
我对我必须为大学做的这项家庭作业感到有些困惑,我了解寄存器是什么,为什么要在内存或寄存器中放置一些字节,但对我推动这一点会有很大帮助第一个练习:
(Gnu 组装):
用指示的操作数的相应值填写下表:
通过查看,我可以看出第一个操作数的十六进制值为0x100并且是一个寄存器,第二个我无法分辨,因为之前没有,第三个操作数有一个美元标志,我读到它是一个立即数操作数,无法判断它得到什么值。
4(%eax) 它可能是一个内存地址,其中 4 是位移,从这一点上我不知道......
我希望我尽可能清楚地了解我的疑问,并非常感谢您提供的任何帮助。
亲切的问候,苏萨。