我只是想确保我正在读这个:
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?
我已经根据MOTOROLA M68000 FAMILY Programmer\xe2\x80\x99s Reference Manual编写了自己的Sega Mega Drive ROM 反汇编程序。拆卸了相当大的 ROM 块后,我尝试使用VASM重新组装这个拆卸的输出,因为它可以使用其语法模块接受摩托罗拉汇编语法。mot
现在,对于绝大多数重组来说,这种方法效果很好,但是,对于具有由“带索引(8 位位移)模式的程序计数器间接”定义的有效地址的操作,存在一个问题。鉴于我现在才学习 Motorola 68000 组装,我想确认我的理解并问:这些操作的正确语法是什么?
\n例如,如果我有两个词:
\n4ebb 0004\nRun Code Online (Sandbox Code Playgroud)\n我将其解释为JSR目标目的地是以下各项的总和:
pc0x04d0(鉴于我将自己限制在 68000,我在扩展字中省略了对sizeand的任何考虑scale)。\n根据参考手册中如何描述此寻址模式,我将其发出为:
jsr ($04,pc,d0)\nRun Code Online (Sandbox Code Playgroud)\n但是,当我将其反馈回 VASM 时,它会发出以下错误:
\nerror 2030 in line X of "XXXX.asm": displacement out of range\n> jsr ($04,pc,d0)\nRun Code Online (Sandbox Code Playgroud)\n这似乎是一个非常奇怪的错误,因为由于寄存器的使用,位移直到运行时才能知道 …
我看到代码如下:
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.
在业余时间,我开始为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) 我正在研究计算机系统,程序员的观点(第 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 位地址?我完全误解了汇编吗?
我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为byte的变量.这给了我错误"错误:无效的有效地址":
mov byte[AX], byte 0x0
Run Code Online (Sandbox Code Playgroud)
经过一些跟踪和错误后,我测试了相同但使用EAX.编译得很好:
mov byte[EAX], byte 0x0
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
在进行逆向工程以获得乐趣时,我遇到了以下装配:
move.b (a1)+,(a0)+
Run Code Online (Sandbox Code Playgroud)
我明白括号的意思是"价值",但加号代表什么?我如何准确地将其转换为C?
我们有一个任务,给出了一个2寻址机器的汇编指令:
Run Code Online (Sandbox Code Playgroud)mov 202, 100[r1+]记下最小的汇编程序指令序列,它取代了这条指令(见上文)
哪里
n[rx+]:寄存器增量索引; n是索引值,rx是寄存器x
单个数值:直接寻址/存储
我们应该使用的地址是:
rx - 注册直接寻址[rx] - 注册间接寻址#n - 直接寻址 我们只允许使用add,sub,mov.
我特别不明白#代表什么,为什么我们需要减法,实际上我真的不懂任何东西......任务已经解决,所以我不是在寻找解决方案.我需要解释它是如何完成的,试图自己理解但它不起作用.我希望有人能帮助我,对你这么好!
解:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
Run Code Online (Sandbox Code Playgroud) 我试图找出 x86 16 位寻址模式(MASM 程序集)中不存在比例因子的原因。而32位和64位寻址模式都有比例因子。这背后是否有实际原因或者不需要它?如果您能解释一下,我将不胜感激。
可以组合不同组件来创建有效地址的所有可能方式:
16 位和 32 位寻址模式之间的差异
在 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在处理这种极端情况时并不值得信赖。
addressing-mode ×10
assembly ×10
x86 ×4
68000 ×3
nasm ×2
x86-16 ×2
6502 ×1
accumulator ×1
att ×1
c++ ×1
disassembly ×1
emulation ×1
instructions ×1
x86-64 ×1