标签: addressing-mode

lea汇编指令

我只是想确保我正在读这个:

movl 12(%ebp), %edx
leal (%edx, %edx, 4), %eax
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以澄清一下吗?

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

leal (%edx, %edx, 4), %eax
leal (%edx, %edx, 2), %eax
Run Code Online (Sandbox Code Playgroud)

执行第二行后,eax寄存器会被覆盖吗?

并将eax = edx + edx*4地址乘以4?或者地址的内容由4?

x86 assembly att addressing-mode

7
推荐指数
2
解决办法
2万
查看次数

Motorola 68000 带有索引的程序计数器间接汇编语法

我已经根据MOTOROLA M68000 FAMILY Programmer\xe2\x80\x99s Reference Manual编写了自己的Sega Mega Drive ROM 反汇编程序。拆卸了相当大的 ROM 块后,我尝试使用VASM重新组装这个拆卸的输出,因为它可以使用其语法模块接受摩托罗拉汇编语法。mot

\n

现在,对于绝大多数重组来说,这种方法效果很好,但是,对于具有由“带索引(8 位位移)模式的程序计数器间接”定义的有效地址的操作,存在一个问题。鉴于我现在才学习 Motorola 68000 组装,我想确认我的理解并问:这些操作的正确语法是什么?

\n

解释

\n

例如,如果我有两个词:

\n
4ebb 0004\n
Run Code Online (Sandbox Code Playgroud)\n

我将其解释为JSR目标目的地是以下各项的总和:

\n
    \n
  • 的内容pc
  • \n
  • 0x04
  • \n
  • 的内容d0
  • \n
\n

(鉴于我将自己限制在 68000,我在扩展字中省略了对sizeand的任何考虑scale)。\n根据参考手册中如何描述此寻址模式,我将其发出为:

\n
jsr ($04,pc,d0)\n
Run Code Online (Sandbox Code Playgroud)\n

使用 VASM 进行组装

\n

但是,当我将其反馈回 VASM 时,它会发出以下错误:

\n
error 2030 in line X of "XXXX.asm": displacement out of range\n>  jsr ($04,pc,d0)\n
Run Code Online (Sandbox Code Playgroud)\n

这似乎是一个非常奇怪的错误,因为由于寄存器的使用,位移直到运行时才能知道 …

assembly 68000 gnu-assembler disassembly addressing-mode

7
推荐指数
1
解决办法
655
查看次数

为什么mov指令直接使用ax而不是两个段寄存器?

我看到代码如下:

mov ax, cs
mov ds, ax
mov es, ax
Run Code Online (Sandbox Code Playgroud)

为什么我不能将其压缩为:

mov ds, cs
mov es, cs
Run Code Online (Sandbox Code Playgroud)

自使用累加器寄存器以来,第一种方式更快吗?但这似乎并不直观,因为cs和ds是段寄存器.还是有一些我不知道的限制?

顺便说一句,我正在使用nasm.

x86 assembly nasm accumulator addressing-mode

6
推荐指数
1
解决办法
604
查看次数

C/C++中的6502仿真器:如何将寻址模式代码与实际指令代码分开

在业余时间,我开始为6502 CPU编写一个非常简单的C++仿真器.我以前写了很多的汇编代码为这个CPU,这样所有的操作码,寻址方式和其他的东西是不是一个大问题.

6502具有56种不同的指令和13种寻址模式,总共有151种不同的操作码.对我来说速度不是问题,所以不要写一个巨大的switch-case语句并反复重复相同的代码(不同的操作码可以使用不同的寻址模式引用相同的指令)我想将实际的指令代码与寻址模式代码:我发现这个解决方案很整齐,因为它需要只写13寻址模式功能和56个指令功能,无需重复自己.

这里的寻址模式功能:

// Addressing modes
uint16_t Addr_ACC(); // ACCUMULATOR
uint16_t Addr_IMM(); // IMMEDIATE
uint16_t Addr_ABS(); // ABSOLUTE
uint16_t Addr_ZER(); // ZERO PAGE
uint16_t Addr_ZEX(); // INDEXED-X ZERO PAGE
uint16_t Addr_ZEY(); // INDEXED-Y ZERO PAGE
uint16_t Addr_ABX(); // INDEXED-X ABSOLUTE
uint16_t Addr_ABY(); // INDEXED-Y ABSOLUTE
uint16_t Addr_IMP(); // IMPLIED
uint16_t Addr_REL(); // RELATIVE
uint16_t Addr_INX(); // INDEXED-X INDIRECT
uint16_t Addr_INY(); // INDEXED-Y INDIRECT
uint16_t Addr_ABI(); // ABSOLUTE INDIRECT
Run Code Online (Sandbox Code Playgroud)

它们都返回指令用来读/写操作数/结果的实际存储器地址(16位)

指令函数原型是:

void Op_ADC(uint16_t addr);
void Op_AND(uint16_t addr);
void Op_ASL(uint16_t addr); …
Run Code Online (Sandbox Code Playgroud)

c++ assembly 6502 emulation addressing-mode

6
推荐指数
1
解决办法
1406
查看次数

将常量字节值移动到 %ebx 时出错

我正在研究计算机系统,程序员的观点(第 3 版),练习题 3.3 包含以下行:

movb $0xF, (%ebx)
Run Code Online (Sandbox Code Playgroud)

我应该找出这行 x86-64 汇编代码有什么问题,答案是:“不能使用 %ebx 作为地址寄存器”,这对我来说没有意义。我的理解是这一行打算将 0xF 复制到主内存中的某个位置,但是 %ebx 是一个 32 位寄存器,64 位机器上的内存地址是 64 位宽,因此 %ebx 不能保存内存地址,因此它不能被取消引用(取消引用是 %ebx 周围的括号所代表的,对吗?)。然而,翻开书中的几页(第 183 页,如果你有的话)有一个例子详细说明了五个 mov 操作数 - 目标组合,其中之一是:

movb $-17, (%esp)         Immediate--Memory, 1 byte
Run Code Online (Sandbox Code Playgroud)

%esp 是一个 32 位寄存器,就像 %ebx! 这个例子显示了一个字节值被移动到一个取消引用的 32 位寄存器!这对我来说没有意义,因为 %esp 如何包含 64 位地址?我完全误解了汇编吗?

assembly x86-64 addressing-mode

6
推荐指数
1
解决办法
2075
查看次数

NASM x86 16位寻址模式

我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为byte的变量.这给了我错误"错误:无效的有效地址":

mov byte[AX], byte 0x0
Run Code Online (Sandbox Code Playgroud)

经过一些跟踪和错误后,我测试了相同但使用EAX.编译得很好:

mov byte[EAX], byte 0x0
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

x86 assembly nasm addressing-mode x86-16

5
推荐指数
1
解决办法
1000
查看次数

68k汇编 - 加上地址寄存器上的符号

在进行逆向工程以获得乐趣时,我遇到了以下装配:

move.b  (a1)+,(a0)+
Run Code Online (Sandbox Code Playgroud)

我明白括号的意思是"价值",但加号代表什么?我如何准确地将其转换为C?

assembly reverse-engineering 68000 addressing-mode

5
推荐指数
2
解决办法
817
查看次数

试图理解这个简短的汇编程序指令,但我不明白

我们有一个任务,给出了一个2寻址机器的汇编指令:

mov 202, 100[r1+]
Run Code Online (Sandbox Code Playgroud)

记下最小的汇编程序指令序列,它取代了这条指令(见上文)

哪里

  • n[rx+]:寄存器增量索引; n是索引值,rx是寄存器x

  • 单个数值:直接寻址/存储

我们应该使用的地址是:

  1. rx - 注册直接寻址
  2. [rx] - 注册间接寻址
  3. #n - 直接寻址

我们只允许使用add,sub,mov.

我特别不明白#代表什么,为什么我们需要减法,实际上我真的不懂任何东西......任务已经解决,所以我不是在寻找解决方案.我需要解释它是如何完成的,试图自己理解但它不起作用.我希望有人能帮助我,对你这么好!

解:

add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
Run Code Online (Sandbox Code Playgroud)

assembly instructions addressing-mode

5
推荐指数
1
解决办法
140
查看次数

为什么 x86 16 位寻址模式没有比例因子,而 32 位版本有比例因子?

我试图找出 x86 16 位寻址模式(MASM 程序集)中不存在比例因子的原因。而32位和64位寻址模式都有比例因子。这背后是否有实际原因或者不需要它?如果您能解释一下,我将不胜感激。

可以组合不同组件来创建有效地址的所有可能方式:

Image of all possible ways different components can be combined to create an effective address

16 位和 32 位寻址模式之间的差异

Differences between 16- and 32-bit addressing modes

x86 assembly addressing-mode x86-16

5
推荐指数
1
解决办法
1158
查看次数

M68K:同一寄存器上的预减

在 M68040 asm 中,给出:

mov.l #0x1000, %a0
mov.l -(%a0), -(%a0)
Run Code Online (Sandbox Code Playgroud)

%a0第二个之后的值是多少mov?寄存器是递减两次还是一次?

mov.l我们可以使用少数几个支持源和目标上的预递减/后递增的指令之一来代替吗?

MC68040 UM 声明move16 (%an)+, (%an)+仅执行单个增量,但我找不到有关一般情况的任何信息。

我正在开发模拟器,但没有实际的 CPU。此外,网上的普遍共识似乎是Easy68k在处理这种极端情况时并不值得信赖。

assembly 68000 addressing-mode

5
推荐指数
1
解决办法
143
查看次数