从https://www.keil.com/support/man/docs/armasm/armasm_dom1361289866046.htm中读取arm-thumb指令的blx指令可以支持最大4MB的跳转范围。
但据我所知,arm-thumb指令只有16位长,那么16位怎么能包含4MB的偏移量呢?
我最初试图生成立即移动到 64 位寄存器的字节。我想要的具体操作是
mov rdi, 0x1337
Run Code Online (Sandbox Code Playgroud)
使用https://www.felixcloutier.com/x86/mov,我看到的唯一非符号扩展指令是
REX.W + B8+ rd io
Run Code Online (Sandbox Code Playgroud)
这让我很困惑,所以我创建了一个小型汇编程序来查看汇编器会生成什么
global _start
section .text
_start:
mov rdi, 0x1337
syscall
mov rax, 60
xor rdi, rdi
syscall
Run Code Online (Sandbox Code Playgroud)
我必须关闭优化,以便迁移到 64 位寄存器。所以我编译nasm -felf64 -O0 main.asm && ld main.o并生成了一个a.out. 我看着objdump -M intel -d ./a.out这行
48 bf 37 13 00 00 00 movabs rdi,0x1337
Run Code Online (Sandbox Code Playgroud)
那条线看起来一点也不像
REX.W + B8+ rd io
Run Code Online (Sandbox Code Playgroud)
大部头书?另外,经过一些研究,我发现该命令应该是 10 个字节。你如何从 得到它REX.W + B8+ rd io?
I386指令集中的“Grpl”指令的作用是什么?我正在学习计算机指令并做指令模拟实验。在模拟的过程中我遇到了这样的指令83 F8 01。
为了了解如何使用该指令,我查阅了 i386 手册中的附录 a 操作码映射。由于该指令的操作码为83,所以我找到了操作码映射条目:
\n
但我不知道GRPL是什么意思,也不知道CPU是做什么的。我检查了Intel 80386指令集,但找不到该指令的描述。以 E 开头的指令后面直接跟着以 H 开头的指令。 (enter和hlt)
我还查了谷歌,找不到该命令的描述。由于不知道这条指令的实际含义,我无法模拟它。CPU是如何实现这个功能的呢?正确的查询是什么?我错过了什么\xef\xbc\x9f
\n我使用以下代码创建了一个简单的 C++ 源文件:
int main() {
int a = 1;
int b = 2;
if(a < b) {
return 1;
}
else if(a > b) {
return 2;
}
else {
return 3;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用objdump命令来获取上述源代码的汇编代码。
该行int b = 2;已转换为mov DWORD PTR [rbp-0x4], 0x2.
其对应的机器码为C7 45 FC 02 00 00 00(十六进制格式)。
我想知道如何将汇编代码转换为二进制代码。我浏览了 x86-64 的英特尔参考手册,但我无法理解它,因为我是低级编程的新手。
我正在编写一个 x86-64 汇编程序。我正在浏览 Intel x86 手册第 2 卷,试图了解如何从程序集中生成正确的指令。我主要了解它是如何工作的,但一直在组装和拆卸说明以检查我是否正确。
在 ADD 参考表(第 2A 卷,3.31)中:
opcode | Instruction
04 ib | ADD AL, imm8
05 iw | ADD AX, imm16
05 id | ADD EAX, imm32
REX.W + 05 id | ADD RAX, imm32
Run Code Online (Sandbox Code Playgroud)
集合:
;add.s
add al, 1
add ax, 1
add eax, 1
add rax, 1
Run Code Online (Sandbox Code Playgroud)
拆卸:
.text:
0: 04 01 add al, 1
2: 66 83 c0 01 add ax, 1
6: 83 c0 01 add eax, 1
9: …Run Code Online (Sandbox Code Playgroud) 我正在阅读英特尔文档,第一卷。1 和3.6.1 64 位模式下的操作数大小和地址大小一章。有三个前缀REX.W,操作数大小66和地址大小67前缀。并提到操作数的大小默认为 32 位。并且只能用REX.W指令前缀(在其他前缀之后)以使其长度为 64 位。
我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如int操作数?跟签有关系吗?或者为什么会有这个限制?(所以,C是否在 int 上unsigned int使用REX.W前缀操作(正如也提到的,前缀仅持续特定指令,而不是整个段,这应该是(大小,地址或操作数)默认值和包含在段描述符中)。
我理解正确吗?
这些是MOV来自Intel\xc2\xae 64 和 IA-32 架构软件开发人员手册的指令操作码:
B8+ rd id MOV r32, imm32 OI Valid Valid Move imm32 to r32。
C7 /0 id MOV r/m32, imm32 MI Valid Valid Move imm32 to r/m32。
我拆解如下:
\n0: b8 44 33 22 11 mov eax, 0x11223344\nRun Code Online (Sandbox Code Playgroud)\n0: 67 c7 00 44 33 22 11 mov DWORD PTR[eax], 0x11223344\nRun Code Online (Sandbox Code Playgroud)\n我想问的问题是:
\n为什么C7操作码是寄存器/内存(r/m32, imm32)而不是仅内存(m32, imm32)?
是否有任何时候我们使用 …
我遇到一个问题,我无法理解该指令MOV BX,CS的操作码,例如第一个字节是 10001100,其中前 6 位表示操作码,然后方向 1 位跟随 W。所以这是我的疑问为什么在操作码中它是 100011 而不是 100010,在 W 单元中为什么有 0 而不是 1,比如出于什么目的,或者有一些我应该小心的条件。
如果有人能给我详细的答案,我将不胜感激。
当我尝试使用不止一种方法来解决时,我无法得到上图中所示的解决方案,并且我观看了很多视频,但没有找到可以澄清我的疑问的答案。
我最近刚刚触及汇编语言和调试的表面。我有以下代码:
Address Hex dump Command Comments
006E3689 . E8 C5F9FFFF CALL 006E3053
->006E368E E9 DB E9
->006E368F 35 DB 35 ; CHAR '5'
->006E3690 80 DB 80
->006E3691 . 0000D490 DD 90D40000
006E3695 /> E8 72040000 CALL 006E3B0C
Run Code Online (Sandbox Code Playgroud)
再往下...
Address Hex dump Command Comments
006EB6C8 /. 6A 58 PUSH 58
006EB6CA |. 68 A0372A00 PUSH 2A37A0
006EB6CF ^ E9 C17FFFFF JMP 006E3695
Run Code Online (Sandbox Code Playgroud)
现在,在我编译 -> 指示的代码之前,实际上都包含在 a 中,JMP 006EB6C8当然只是跳到第二组代码,推送了一些内容并返回到顶部。
现在这段代码仍然有效,但我不确定为什么代码在编译时发生了变化(使用 Ollydbg),但更重要的是(我相信)代码如何知道跳转以及跳多远。到目前为止,我的研究告诉我E9是跳转的操作码,但我还没有找到有关 和35的信息80。
我假设这 …
我需要帮助了解如何在 RISCV 中解决这个问题。提供以下十六进制值的汇编语言指令:
地址 1000:b3 地址 1001:0b 地址 1002:9c 地址 1003:41
我知道我必须更改为二进制,并且 RISCV 是小端字节序,但除此之外我不知道如何继续。我有几个这样的问题,但我想自己解决剩下的问题。
我目前正在上一门低级编程课程,不幸的是,我在我们的教科书中找不到这些信息(大多数问题都没有包含在我们的课本中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似的东西”的信息。问题如下:
给出每条指令的操作码和代码字节数。
(a) mov exc, 984 Op Code_____ 字节数_____
(b) xchg eax, ecx Op Code_____ 字节数_____
还有很多,但如果有人能帮助我理解如何做这两个,我希望能够将其转化为其他问题。
我尝试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 中创建了一个小的 *.asm 项目,并在 (a) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:
Run Code Online (Sandbox Code Playgroud)00000000 B9 000003D8 mov ecx, 984
我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。