问题标签 [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.
c - 内存间接寻址 movl - 程序集
我试图了解内存间接寻址在具有 AT&T 语法的汇编语言中究竟是如何工作的。
这是一个类似的问题,解释了内存间接寻址
这是我的理解:
在第一种情况下,您load
将寄存器指向的数据%eax
存储在%ebx
.
在第二种情况下,你将寄存器中store
的数据放到寄存器%eax
指向的地址空间%ebx
。我对么?
assembly - 汇编代码:理解 lea 命令
我找到了这段代码:
但我真的不明白这个组合。
- lea 命令的堆栈上到底发生了什么。
- 写: mov 0x10(%edi),0x4(edi%) 不是更容易吗?
assembly - 关于汇编语言的注册间接模式的更多见解
我正在阅读 Richard C. Detmer 撰写的一本关于 80x86 汇编语言的书,题为“80x86 汇编语言和计算机体系结构第二版简介”。我很难理解注册间接模式,我的书是这样说的:
“我们的示例程序没有带有寄存器间接内存操作数的指令。这是一个样子。注释给出了您将在列表文件中看到的目标代码。
add eax, [edx] ; 03 02
第一个操作数 EAX 显然是寄存器模式,第二个操作数是寄存器间接模式。请注意,目标代码只有 2 个字节,不足以包含 32 位内存地址。相反,第二个字节包含表示使用 EDX 寄存器中的地址来定位第二个双字操作数的位。换句话说,第二个数字不在 EDX 中,但它的地址在。方括号符号 ([ ]) 表示汇编语言中的间接寻址。” - 底部的第 65 页(如果您可能有教科书)。
这本书显示了内存插槽的图片和 EDX 在内存中的地址(操作数的地址)位置及其突出显示。
好的,我输入了那个小部分,因为我不明白,它说使用 EDX 中的地址来定位第二个 dword,但它说第二个数字不在 EDX 中,但它的地址是。什么??所以我们获取了 EDX 的地址,但是这如何给我们一个内存中的数字呢?我认为地址只是针对 EDX,以及寄存器中包含的任何内容,那么你怎么能不从 EDX 获得一个数字而只使用内存地址呢?地址指向 EDX 及其包含的内容,所以如果您使用地址而不是通常在 EDX 中获得值?那么下面的这个说法不一样吗?:
如果有人能给我更多关于寄存器间接模式的见解,并提供一些示例、解释和对我上面问题的答案,我将非常感激。
assembly - 带有字节目标的 mov 指令,用于立即到内存
我正在阅读Richard C. Detmer 的《 80x86 汇编语言和计算机体系结构简介》的教科书
我有一个关于立即到内存mov
操作码的问题。这里也是我所指的文本部分:
继续向下图 4.1,下一行是立即到内存的移动。这些指令中的每一个都有操作码
C6
、一个 ModR/M 字节、额外的地址字节(如果需要),最后是一个包含立即操作数的字节。地址的编码如上所述,用于内存到寄存器的移动。例如,如果smallCounter
引用内存中的一个字节并汇编指令mov smallCounter, 100
,则汇编器将生成 7 (3+4) 个字节的目标代码,C6 05 xx xx xx xx 64
其中xx xx xx xx
表示内存中的地址,64 是 100 的字节大小十六进制版本. ModR/M 字节 05 是00 000 101
,Mod=00 和 R/M=101 用于直接内存寻址,不需要 Reg 字段并设置为 000。作为另一个示例,考虑
mov BYTE PTR [edx], -1
使用寄存器间接模式的内存目标。操作码仍然是 C6,并且立即字节(总是最后出现)现在是 FF 表示 -1。第二个字节是 ModR/M 字节,Mod=00 用于寄存器间接,Reg=000(未使用),R/M=010 用于 EDX,制作00 000 010
或 02。目标代码用于C6 02 FF
.第 92 页,第 4 章,第 1 节 - 复制数据
图 4.1 - 标题为带有字节目标的 mov 指令- 是一个包含四列的图表:
- 第一个列出目的地
- 第二个列出来源
- 第三个列出操作码
- 第四个列出对象代码的字节
上面部分所指的图表中的线也是:
目标:内存字节源:立即字节操作码:C6目标代码字节:3+
请原谅我说了这么多,但我希望你和我能在我的书所说的内容上保持一致。我理解smallCounter的部分,但令我困惑的是,它的目标代码mov BYTE PTR [edx], -1
在内存中没有地址。它处于间接模式,因此edx将位置作为指针,那么为什么目标代码不包含它指向的内存中的地址呢?这仅适用于smallCounter的操作码具有地址的变量吗?与其他语句相比,为什么总体操作码与smallCounter的方式相同?
assembly - x86 上是否有偏移写回?
使用 ARM,我可以访问这样的内存位置:
这意味着我想加载 r1 指向的值,偏移量为 4 个字节,并且!表示我希望在这条指令之后用新值(即 +4)更新 r1 的值。
x86 上是否有等价物(如果可能,AT&T 语法)?例如:
这会将 %ebx 指向的值以 4 个字节的偏移量加载到 %eax 中。加载后如何更新 %ebx 的值?
谢谢。
assembly - 在间接寻址中正确使用比例值
如果我必须用这样的寻址来翻译一个简单的 C 函数:
在 System V AMD X86-64(AT&T 标准)程序集中,使用index
,base
寄存器加一个scale
值的间接寻址。
那么,因为在汇编中没有任何类型的指针算术,所以比例值应该是4
整数指针?
这段代码正确吗?
motorola - 68000内部如何表示指令?
68000内部如何表示指令。我读过有不同类型的指令:单一有效操作字格式指令,简短和完整的扩展字格式指令。单个有效操作字指令似乎代表指令,该指令的低 6 位代表寻址方式和寄存器。这种寻址模式和寄存器是否会告诉您是否遵循简短或完整的扩展字格式指令,该指令又代表指令的操作数。你知道比68000编程参考手册更好的手册吗?
提前致谢
assembly - 在 x86 程序集的 AT&T 语法中,括号中的逗号是什么意思?
AT&T 汇编中的含义是什么(register1, register2, 4)
?
例如:
cuda - CUDA纹理的不同寻址模式
我在边界寻址模式 ( cudaAddressModeBorder
) 中使用 CUDA 纹理。我正在使用tex2D<float>()
. 当纹理坐标落在纹理之外时,tex2D<float>()
返回0
.
如何将此返回的边框值更改0
为其他值?我可以手动检查纹理坐标并自己设置边框值。我想知道是否有 CUDA API 可以设置这样的边界值。
c++ - C/C++ 中的 6502 仿真器:如何将寻址模式代码与实际指令代码分开
在业余时间,我开始为 6502 CPU 编写一个非常简单的 C++ 模拟器。我曾经为这个 CPU 写了很多汇编代码,所以所有的操作码、寻址模式和其他东西都没什么大不了的。
6502 有 56 条不同的指令加上 13 种寻址模式,总共提供 151 种不同的操作码。对我来说速度不是问题,所以我不想编写一个巨大的 switch-case 语句并一次又一次地重复相同的代码(不同的操作码可以使用不同的寻址模式引用相同的指令)我想将实际的指令代码与寻址模式代码:我发现这个解决方案非常简洁,因为它只需要编写 13 个寻址模式函数和 56 个指令函数而无需重复自己。
这里的寻址模式功能:
它们都返回指令用于读取/写入操作数/结果的实际内存地址(16 位)
指令函数原型为:
它采用 16 位地址,执行自己的操作,更新状态标志和/或寄存器,并将结果(如果有)提交到相同的内存地址。
鉴于该代码框架,我发现难以使用累加器寻址模式,这是唯一一种返回 A 内部寄存器的实际值而不是内存地址的模式。我可以使用 uin16_t 返回类型返回 A 的值,并为这种寻址模式添加一个布尔标志,但我发现它是一个非常丑陋的解决方案。
指令功能应该完全与寻址模式无关。