标签: instruction-encoding

arm-thumb指令集的blx指令如何支持4MB范围

https://www.keil.com/support/man/docs/armasm/armasm_dom1361289866046.htm中读取arm-thumb指令的blx指令可以支持最大4MB的跳转范围。

但据我所知,arm-thumb指令只有16位长,那么16位怎么能包含4MB的偏移量呢?

assembly arm machine-code thumb instruction-encoding

2
推荐指数
1
解决办法
1427
查看次数

您如何理解 x86-64 汇编的“REX.W + B8+ rd io”形式?

我最初试图生成立即移动到 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

assembly x86-64 nasm machine-code instruction-encoding

2
推荐指数
1
解决办法
848
查看次数

I386指令集中GRPL指令的作用是什么?

I386指令集中的“Grpl”指令的作用是什么?我正在学习计算机指令并做指令模拟实验。在模拟的过程中我遇到了这样的指令83 F8 01

\n

为了了解如何使用该指令,我查阅了 i386 手册中的附录 a 操作码映射。由于该指令的操作码为83,所以我找到了操作码映射条目:
\n操作码映射截图

\n

但我不知道GRPL是什么意思,也不知道CPU是做什么的。我检查了Intel 80386指令集,但找不到该指令的描述。以 E 开头的指令后面直接跟着以 H 开头的指令。 (enterhlt)

\n

我还查了谷歌,找不到该命令的描述。由于不知道这条指令的实际含义,我无法模拟它。CPU是如何实现这个功能的呢?正确的查询是什么?我错过了什么\xef\xbc\x9f

\n

x86 assembly machine-code opcode instruction-encoding

2
推荐指数
1
解决办法
149
查看次数

如何将汇编代码转换为二进制代码?

我使用以下代码创建了一个简单的 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 的英特尔参考手册,但我无法理解它,因为我是低级编程的新手。

binary assembly x86-64 instruction-encoding

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

为什么我的汇编器不使用 ADD EAX,1 手册文档中的 05 操作码 (add eax,imm32) 简写形式,但对 04 ADD AL, 1 却使用它?

我正在编写一个 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)

x86 assembly machine-code opcode instruction-encoding

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

为什么在 64 模式下默认操作数大小为 32 位?

我正在阅读英特尔文档,第一卷。1 和3.6.1 64 位模式下的操作数大小和地址大小一章。有三个前缀REX.W,操作数大小66和地址大小67前缀。并提到操作数的大小默认为 32 位。并且只能用REX.W指令前缀(在其他前缀之后)以使其长度为 64 位。

我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如int操作数?跟签有关系吗?或者为什么会有这个限制?(所以,C是否在 int 上unsigned int使用REX.W前缀操作(正如也提到的,前缀仅持续特定指令,而不是整个段,这应该是(大小,地址或操作数)默认值和包含在段描述符中)。

我理解正确吗?

64-bit assembly x86-64 machine-code instruction-encoding

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

MOV r/m32、imm32 和 MOV r32、imm32 之间的操作码差异

这些是MOV来自Intel\xc2\xae 64 和 IA-32 架构软件开发人员手册的指令操作码:

\n

B8+ rd id MOV r32, imm32 OI Valid Valid Move imm32 to r32

\n

C7 /0 id MOV r/m32, imm32 MI Valid Valid Move imm32 to r/m32

\n

我拆解如下:

\n
0:  b8 44 33 22 11          mov    eax, 0x11223344\n
Run Code Online (Sandbox Code Playgroud)\n
0:  67 c7 00 44 33 22 11    mov    DWORD PTR[eax], 0x11223344\n
Run Code Online (Sandbox Code Playgroud)\n

我想问的问题是:

\n
    \n
  • 为什么C7操作码是寄存器/内存(r/m32, imm32)而不是仅内存(m32, imm32)?

    \n
  • \n
  • 是否有任何时候我们使用 …

assembly x86-64 machine-code opcode instruction-encoding

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

为什么来自段寄存器的 MOV 操作码没有设置其低位?它不是 8 位操作数大小,因此应设置 W 位

我遇到一个问题,我无法理解该指令MOV BX,CS的操作码,例如第一个字节是 10001100,其中前 6 位表示操作码,然后方向 1 位跟随 W。所以这是我的疑问为什么在操作码中它是 100011 而不是 100010,在 W 单元中为什么有 0 而不是 1,比如出于什么目的,或者有一些我应该小心的条件。

这是指令表示

如果有人能给我详细的答案,我将不胜感激。

当我尝试使用不止一种方法来解决时,我无法得到上图中所示的解决方案,并且我观看了很多视频,但没有找到可以澄清我的疑问的答案。

x86 assembly cpu-architecture mov instruction-encoding

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

了解汇编中的 JMP 代码

我最近刚刚触及汇编语言和调试的表面。我有以下代码:

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

我假设这 …

x86 assembly opcode disassembly instruction-encoding

0
推荐指数
1
解决办法
2859
查看次数

RISCV解析操作码

我需要帮助了解如何在 RISCV 中解决这个问题。提供以下十六进制值的汇编语言指令:
地址 1000:b3 地址 1001:0b 地址 1002:9c 地址 1003:41

我知道我必须更改为二进制,并且 RISCV 是小端字节序,但除此之外我不知道如何继续。我有几个这样的问题,但我想自己解决剩下的问题。

machine-code opcode riscv instruction-encoding

0
推荐指数
1
解决办法
1607
查看次数

给出每条指令的操作码和代码字节数

我目前正在上一门低级编程课程,不幸的是,我在我们的教科书中找不到这些信息(大多数问题都没有包含在我们的课本中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似的东西”的信息。问题如下:

给出每条指令的操作码和代码字节数。
(a) mov exc, 984 Op Code_____ 字节数_____
(b) xchg eax, ecx Op Code_____ 字节数_____

还有很多,但如果有人能帮助我理解如何做这两个,我希望能够将其转化为其他问题。

我尝试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 中创建了一个小的 *.asm 项目,并在 (a) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:

00000000  B9 000003D8         mov  ecx, 984   
Run Code Online (Sandbox Code Playgroud)

我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。

x86 assembly instruction-encoding

-1
推荐指数
1
解决办法
62
查看次数