我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为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?
我在试卷中遇到了这个问题.它说,哪种给定的寻址模式更快?为什么?
现在根据我的寄存器寻址模式应该更快,因为寄存器是计算机中最快的存储位置.这是正确答案吗?
请帮忙.谢谢
如果我的一个命令行说:
jmp *0x804a180(,%eax,4)
Run Code Online (Sandbox Code Playgroud)
那是什么意思?我特别要求,因为在第一个逗号之前没有值,我不确定地址前的*是什么意思.
68000内部是如何表示指令的。我读过有不同类型的指令:单个有效操作字格式指令、简短和完整扩展字格式指令。单条有效的操作字指令似乎代表指令,该指令的低6位代表寻址方式和寄存器。这种寻址模式和寄存器是否会告诉您是否有一个简短的或完整的扩展字格式指令,该指令又代表该指令的操作数。你知道比 68000 编程参考手册更好的手册吗?
提前致谢
即不同的寻址模式是否以某种方式编码在操作码中?可以通过编程方式提取它们还是这些信息仅存在于 6502 的文档中?我正在编写一个模拟器,我不关心性能。如果可能的话,最好有一个接受操作码并返回寻址模式的函数。
到目前为止,我还没有发现任何迹象表明代码中存在某种模式,除了所有零页指令似乎都设置了第三位之外。
我有一个内存位置,其中包含一个我想要与另一个角色进行比较的角色(并且它不在堆栈的顶部,所以我不能只是pop它).如何引用内存位置的内容以便进行比较?
基本上我如何在语法上做到这一点.
我是组装新手,我正在从头开始编程学习它。在第 41 页和第 42 页,该书讨论了索引寻址模式。
内存地址引用的一般形式是:
ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)
所有字段都是可选的。要计算地址,只需执行以下计算:
FINAL ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX
ADDRESS_OR_OFFSET 和 MULTIPLIER 必须都是常量,而另外两个必须是寄存器。如果任何部分被遗漏,它只是在等式中用零代替。
所以我决定稍微玩一下这个。我写了下面的一段代码:
.code32
.section .data
str:
.ascii "Hello world\0"
.section .text
.global _start
_start:
movl $2, %ecx # The index register.
mov str(, %ecx, ), %bl
movl $1, %eax
int $0x80
Run Code Online (Sandbox Code Playgroud)
我希望得到 72(H 的 ASCII 代码)作为程序的退出结果,因为没有任何乘数(根据这本书,应该用零代替)。但令人惊讶的是,我得到了 108(l 的 ASCII 代码)。我认为这可能是.ascii一回事,并试图查看是否可以使用不同的数据类型获得不同的结果。我得到了相同的结果.byte。
我尝试使用 AT&T 语法在 x86 程序集中查找索引寻址模式,但找不到任何有用的信息(可能是因为我不知道要搜索什么)。
有什么我遗漏的或者是书中的错误吗?鉴于我是该领域的新手,如果您详细说明,我真的很感激。
在汇编中,方括号似乎与C编程语言中的[]含义相同。它们用于取消引用指针。取消引用指针意味着要引用特定的内存位置来读取或写入它。*
因此,在 a 的情况下使用方括号是非常合乎逻辑的MOV。但他们也将其用于 LEA 的逻辑原因是什么?
LEA EAX, [EBP -4],看起来像取消引用指针,EBP - 4,以引用指向的内存位置,但它不会读取该位置中包含的值,而是读取地址。
我对此有点困惑。你能给我正确的思考方式吗?与取消引用的概念有任何联系
吗?LEA显然不是为了读取内存,而是主要指代内存位置,不是为了它的值,而是为了它的地址。我不希望这成为一个哲学问题。