大道至简--明白了一个地球人都明白的问题。

可执行程序被载入内存后进行,机器执行的肯定是编译后的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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值