可执行程序被载入内存后进行,机器执行的肯定是编译后的2进制代码,因此书写程序是用高级语言调用函数或其他等都被编译器编译成对应2进制代码。因此,如果你足够牛的话,直接写2进制代码也可。^_^
for exaple:(摘自8086 Assembler Tutorial for Beginners )
#MAKE_COM#
ORG 100h
MOV AL, var1
MOV BX, var2
RET ; stops the program.
VAR1 DB 7
var2 DW 1234h
等价于:
#MAKE_COM#
ORG 100h
DB 0A0h
DB 08h
DB 01h
DB 8Bh
DB 1Eh
DB 09h
DB 01h
DB 0C3h
DB 7
DB 34h
DB 12h
另外一个例子:是关于jmp的,演示跳过几个字节的代码执行下面的代码
ORG 100h
; unconditional jump forward:
; skip over next 2 bytes,
JMP $2; 对应二进制代码为:EB02
a DB 3 ; 1 byte.;被跳过部分
b DB 4 ; 1 byte.;被跳过部分
; JCC jump back 7 bytes:
; (JMP takes 2 bytes itself)
MOV BL,9
DEC BL ; 2 bytes.
CMP BL, 0 ; 3 bytes.
JNE $-7
RET
END
由于可以直接书写二进制代码(对cpu来说它认识的只有这个而已),因此上面例子中的jmp $2可以向下面这样写:
下面是我在delphi中做的测试。
procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin
asm
mov bl,1
DB $EB,$02
dec bl //被跳过 ,这一句对应二进制代码FECB刚好两个字节,(如果不是两个字节就异常了)
mov al ,bl
mov i,al
end;
showmessage(inttostr(i)); //显示1
end;