如何用汇编语言(intel)执行机器指令

时间:2012-08-28 15:46:08

标签: assembly x86 fasm

如果我有一个像00010101这样的指令,并且我在ram中有程序可以访问,那么如果不使用OS函数,我怎么能用汇编语言来执行该指令?我正在使用Fasm作为英特尔。感谢。

编辑:我知道这是非常糟糕的代码,我甚至还没有组装它,我知道很多都是错的,但请记住这是为了学习目的。这是使用二进制指令加载文件并将其存储在ram中的代码的一部分。我再一次知道这很糟糕。

loadkernel:
    mov dx, 1F7h
    in dx, bl
    bt bl, 6    ;this reads the sixth bit of bl and stores it in the carry flag(cf)

    cmp cf, 1   ;if bit 6 is one, then the hard drive is signaling that it is ready for the next operation
    jz loadkernel
    clc ;clear carry flag


beginload:
    mov eax, 300h
    mov ecx, eax    ;copy the starting point of the kernel in memory to ecx
    mov ebx, 0  ;clear
    mov edx, 0  ;clear

    mov bl, 1F4h
    out ebx, bl ;give the hard drive the low address of the location of the kernel
    mov bl, 1F5h
    out 0h, bl      ;give the hard drive the high address of the location of the kernel

    mov bl, 1F0h

    in edx, bl   ;read the hard drive
    mov [eax], edx   ;add kernel data to memory
    add eax, 1

    inc ebx     ;move the hard drive reading head thing forward

    mov ip, [eax]   ;mov the instruction pointer to memory, so that the computer excecutes the kernel

    cmp edx, 0AA55h
    jz beginload    ;if 0AA55h is not at the end, then read the next data of the kernel.

2 个答案:

答案 0 :(得分:2)

根据您的执行环境,您可能必须禁用(大多数)操作系统的执行 - 禁用程序安全性。这是为了使易受攻击的程序更难以注入代码。如果您在独立环境(如DOS或自己的内核)中运行,则无需担心这一点。

无论如何,你所要做的就是:

mov ax,0x9090 //0x90 is opcode for NOP
mov [code],ax
code:
jmp  foo //this is a 2-byte opcode (so long as it does the "correct" behavior and generate a relative jmp

bar:
hlt //this will get executed "magically"

foo:
//won't get here

答案 1 :(得分:1)

只需跳转到存储指令的地址即可。