有没有办法将特定的立即字节大小的数字'移动到直接内存位置?即
MOV 10h,ffffh
将值16写入内存地址65535?如果是,那是哪个操作码,或者我是否必须先将存储器地址存入寄存器?
当我objdump -D用来反汇编二进制时,典型的代码jmpq就像e9 7f fe ff ff是,用于表示负偏移.但是,x86-64的地址是64(48)位(据我所知),那么这个32位地址如何7f fe ff ff表示64位绝对地址的负偏移?
此外,还有像任何其他指令jmp和jmpq,但有64位地址位移?我怎样才能找到英特尔或AMD手册中的说明(我搜索jmpq但没有找到任何内容)?
当我搜索时,它似乎被称为RIP相对寻址.似乎并非所有说明都这样做.是否有64位相对寻址?如果是间接跳转,64位绝对地址将在寄存器或内存中,对吧?
我正在尝试将我编写的汇编程序转换为无 NULL 的 shellcode。
但是,我不确定如何执行某些说明。
其中一些(采用英特尔语法)包括:
push 0x1000
和
mov BYTE [eax],0x31
我想避免使用数千inc eax条指令。我在想也许可以用xor-ing 值来一些创造性的东西,其次,也许可以设置一个标志来使其只需要 8 位的常量。
编码
call qword ptr [rax]
call qword ptr [rcx]
是
FF 10
FF 11
我可以看到最后一个数字(0/1)的来源(寄存器号),但我想弄清楚第二个数字(1)的来源.根据AMD64架构程序员手册第3卷:通用和系统指令第56页,
"/ digit - 表示ModRM字节仅指定一个寄存器或存储器(r/m)操作数.该数字由ModRM寄存器字段指定,用作指令操作码扩展.有效数字值的范围为0到7. "
等效的英特尔文档说明了类似的内容,并call通过寄存器指定编码为
FF /2
并且...我不知道这意味着什么,或者规范中的2如何连接到最终结果中的高1位数.在任何地方都有不同措辞的解释吗?
x86 CPU有一些处理整数和浮点数的指令.
例如:INC指令递增一个整数(可以存储在存储器或寄存器中)1,因此INC指令"知道"它应该将它正在操作的位解释为整数.那么我们可以说x86 CPU有数据类型(我们可以说C++有数据类型)吗?或者为了让我们能够说出来,x86 CPU应该提供类型安全等其他功能(它没有提供)?
出于兴趣,我想在机器代码中编写一个小程序.
我目前正在学习寄存器,ALU,总线和内存,我有点着迷,指令可以用二进制而不是汇编语言编写.
是否需要使用编译器?
最好是在OSX上运行的.
在查看x86操作码映射时,例如:
http://www.mlsite.net/8086/#tbl_map1
它定义了映射,例如:
00: ADD Eb,Gb
01: ADD Ev,Gv
...
该链接具有字母含义的基本描述,例如:
- E:操作码后面有一个ModR/M字节并指定操作数.操作数是通用寄存器或存储器地址.如果它是存储器地址,则从段寄存器和以下任何值计算地址:基址寄存器,索引寄存器,位移.
- b:字节参数.
但它有点太模糊了.你如何将其转化为"完整的操作码"(操作码中的整个指令+ args)?还没有能够从英特尔手册中找到它,也许我在寻找错误的地方(而且有点压倒性的)?看到显示输入指令的输出操作码的片段(以及你是如何做到的)将是非常有用的.
I386指令集中的“Grpl”指令的作用是什么?我正在学习计算机指令并做指令模拟实验。在模拟的过程中我遇到了这样的指令83 F8 01。
为了了解如何使用该指令,我查阅了  i386 手册中的附录 a 操作码映射。由于该指令的操作码为83,所以我找到了操作码映射条目:
\n
但我不知道GRPL是什么意思,也不知道CPU是做什么的。我检查了Intel 80386指令集,但找不到该指令的描述。以 E 开头的指令后面直接跟着以 H 开头的指令。 (enter和hlt)
我还查了谷歌,找不到该命令的描述。由于不知道这条指令的实际含义,我无法模拟它。CPU是如何实现这个功能的呢?正确的查询是什么?我错过了什么\xef\xbc\x9f
\n