相关疑难解决方法(0)

JMP指令 - 十六进制代码

对JMP机器指令的十六进制代码转换有疑问.我有要跳转的绝对地址,说"JMP 0x400835".首先,这是允许的吗?如果是,相应的十六进制代码是什么?如果没有,我可以先将地址存储在某个寄存器中,比如EAX,然后输入"JMP EAX"吗?我正在研究x86(64b)架构.

我试图从gdb中的diassem输出打印出十六进制代码,但没有一致性,即我没有在十六进制代码中看到目标地址.

我是十六进制代码和机器指令的新手,所以请原谅我的无知.

hex x86-64

13
推荐指数
2
解决办法
3万
查看次数

在x86机器代码中调用绝对指针

什么是callx86机器代码中绝对指针的"正确"方法?有没有一种方法可以在一条指令中完成它?

想做什么:

我正在尝试基于"子程序线程"构建一种简化的迷你JIT(仍然).它基本上是字节码解释器中最短的步骤:每个操作码都是作为一个单独的函数实现的,因此每个基本的字节码块都可以"JIT"到它自己的新程序中,如下所示:

{prologue}
call {opcode procedure 1}
call {opcode procedure 2}
call {opcode procedure 3}
...etc
{epilogue}
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法是每个块的实际机器代码只能从模板中粘贴(根据需要扩展中间部分),并且需要"动态"处理的唯一位是将每个操作码的函数指针复制到正确的位置作为每个调用指令的一部分.

我遇到的问题是了解call ...模板部分的用途.x86似乎没有考虑到这种用法,并且有利于相对和间接调用.

看起来像我可以使用FF 15 EFBEADDE2E FF 15 EFBEADDE在假设调用函数DEADBEEF(通过把东西变成一个汇编和反汇编,看到什么产生有效的结果,基本上发现了这些通过了解他们在做什么),但我不理解的东东细分,特权和相关信息足以看出差异,或者这些信息与更常见的call指令有何不同.英特尔架构手册还建议这些仅在32位模式下有效,在64位模式下"无效".

有人可以解释这些操作码以及我是如何或者是否会为此目的使用它们或其他人?

(通过寄存器使用间接调用也有明显的答案,但这似乎是"错误的"方法 - 假设实际存在直接调用指令.)

x86 jit machine-code

7
推荐指数
2
解决办法
4148
查看次数

$ NAS如何在NASM中工作?

message db "Enter a digit ", 0xA,0xD
Length equ $- message
Run Code Online (Sandbox Code Playgroud)

它用于获取字符串的长度吗?
它在内部如何运作?

x86 assembly nasm

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

Visual C内联汇编程序中的立即调用/ jmp

当我尝试立即调用或跳转到VC++ 2010内联汇编程序时

_asm 
{
    call 00405B90h;
    jmp 00405B90h;
    jmp far 00405B90h;
}
Run Code Online (Sandbox Code Playgroud)

它会产生错误

C2415: improper operand type
Run Code Online (Sandbox Code Playgroud)

是否可能以及如何做到这一点?

到目前为止,我有一个解决方法:

_asm 
{
    push 00405B90h; // This is a jump work around
    call 00405B90h;        
}
Run Code Online (Sandbox Code Playgroud)

assembly visual-c++

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

标签 统计

assembly ×2

x86 ×2

hex ×1

jit ×1

machine-code ×1

nasm ×1

visual-c++ ×1

x86-64 ×1