相关疑难解决方法(0)

是否有x86操作码用于将立即字节移动到直接存储器位置(不使用寄存器)?

有没有办法将特定的立即字节大小的数字'移动到直接内存位置?即

MOV 10h,ffffh
Run Code Online (Sandbox Code Playgroud)

将值16写入内存地址65535?如果是,那是哪个操作码,或者我是否必须先将存储器地址存入寄存器?

x86 assembly opcodes

16
推荐指数
2
解决办法
7193
查看次数

为什么x86-64的jmpq只需要32位长度的地址?

当我objdump -D用来反汇编二进制时,典型的代码jmpq就像e9 7f fe ff ff是,用于表示负偏移.但是,x86-64的地址是64(48)位(据我所知),那么这个32位地址如何7f fe ff ff表示64位绝对地址的负偏移?

此外,还有像任何其他指令jmpjmpq,但有64位地址位移?我怎样才能找到英特尔或AMD手册中的说明(我搜索jmpq但没有找到任何内容)?


当我搜索时,它似乎被称为RIP相对寻址.似乎并非所有说明都这样做.是否有64位相对寻址?如果是间接跳转,64位绝对地址将在寄存器或内存中,对吧?

assembly x86-64 computer-architecture

11
推荐指数
2
解决办法
3954
查看次数

无 NULL 的 shellcode

我正在尝试将我编写的汇编程序转换为无 NULL 的 shellcode。

但是,我不确定如何执行某些说明。
其中一些(采用英特尔语法)包括:

push 0x1000
Run Code Online (Sandbox Code Playgroud)

mov BYTE [eax],0x31
Run Code Online (Sandbox Code Playgroud)

我想避免使用数千inc eax条指令。我在想也许可以用xor-ing 值来一些创造性的东西,其次,也许可以设置一个标志来使其只需要 8 位的常量。

null x86 assembly instruction-set shellcode

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

x64指令编码和ModRM字节

编码

call qword ptr [rax]
call qword ptr [rcx]
Run Code Online (Sandbox Code Playgroud)

FF 10
FF 11
Run Code Online (Sandbox Code Playgroud)

我可以看到最后一个数字(0/1)的来源(寄存器号),但我想弄清楚第二个数字(1)的来源.根据AMD64架构程序员手册第3卷:通用和系统指令第56页,

"/ digit - 表示ModRM字节仅指定一个寄存器或存储器(r/m)操作数.该数字由ModRM寄存器字段指定,用作指令操作码扩展.有效数字值的范围为0到7. "

等效的英特尔文档说明了类似的内容,并call通过寄存器指定编码为

FF /2
Run Code Online (Sandbox Code Playgroud)

并且...我不知道这意味着什么,或者规范中的2如何连接到最终结果中的高1位数.在任何地方都有不同措辞的解释吗?

64-bit x86 assembly x86-64 instruction-set

7
推荐指数
3
解决办法
6098
查看次数

我们可以说x86 CPU有数据类型吗?

x86 CPU有一些处理整数和浮点数的指令.

例如:INC指令递增一个整数(可以存储在存储器或寄存器中)1,因此INC指令"知道"它应该将它正在操作的位解释为整数.那么我们可以说x86 CPU有数据类型(我们可以说C++有数据类型)吗?或者为了让我们能够说出来,x86 CPU应该提供类型安全等其他功能(它没有提供)?

x86 assembly types

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

/ 4在FF/4中的含义是什么?

通常在x86文档中引用的一个站点有一些带有斜杠和数字的指令代码.例如,jmp接近绝对间接给出FF /4,而jmp远绝对间接给出FF /5.

什么的/4/5是什么意思?

为了运行一个快速的小测试,我附加了一个32位进程,分配了一点内存并插入了汇编程序jmp dword ptr[0x12345678]; 生成的字节码是FF 25 78563412.我理解地址的结尾,但是如何25/4/5

我的猜测是我生成了一个jmp远,并且/5意味着有五个字节作为参数(地址为4个字节+ 1个字节25).我仍然对它的来源感到困惑25.

x86 assembly

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

我会用什么编译器来编写机器语言?

出于兴趣,我想在机器代码中编写一个小程序.

我目前正在学习寄存器,ALU,总线和内存,我有点着迷,指令可以用二进制而不是汇编语言编写.

是否需要使用编译器?

最好是在OSX上运行的.

assembly machine-code

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

如何解读x86操作码映射?

在查看x86操作码映射时,例如:

http://www.mlsite.net/8086/#tbl_map1

它定义了映射,例如:

00: ADD Eb,Gb
01: ADD Ev,Gv
...
Run Code Online (Sandbox Code Playgroud)

该链接具有字母含义的基本描述,例如:

  • E:操作码后面有一个ModR/M字节并指定操作数.操作数是通用寄存器或存储器地址.如果它是存储器地址,则从段寄存器和以下任何值计算地址:基址寄存器,索引寄存器,位移.
  • b:字节参数.

但它有点太模糊了.你如何将其转化为"完整的操作码"(操作码中的整个指令+ args)?还没有能够从英特尔手册中找到它,也许我在寻找错误的地方(而且有点压倒性的)?看到显示输入指令的输出操作码的片段(以及你是如何做到的)将是非常有用的.

x86 assembly machine-code

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

当我们只知道操作码的十六进制时如何对指令进行编码

来源中,他们给出了 cmp r/m16/32 imm8 的十六进制为 0x837。我在哪里得到的,ebp 的十六进制是 0b0101。有了这些信息,我如何对指令进行编码cmp dword [ebp-4] 2?我已经搜索了几个小时,除了这个(第 61 页)cmpb $0xf,(%rdi)编码为 80 3f 0f 的类似指令之外,没有任何线索。但我无法理解这一点,因为我提到的前一个来源说 0x803 是针对 sbb 的。另外,rdi 是 0b0111 而不是 0b1111(实际上是 r15)。我很困惑...如果可能的话,我想要 x86-32 和 x86-64 的编码指令。

x86 assembly x86-64 instruction-encoding

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

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
查看次数