pc执行机器码,不管用什么写,只要生成能执行的机器码即可。看如下方式:
方式1:
直接
使用二进制编辑器直接编写机器码(TAT只要你知道机器码咋写就行),然后裸机就可以直接跑
机器码
|
\/
二进制文件
方式2:
通过汇编指令,经过编译,把二进制数据写入二进制文件,看上去数据依旧是那么令人爆炸,事实也确实是这样把,也有些爆炸(和方式1一样,只不过是通过汇编写机器码)
汇编(指令+机器码)
|
|
| 编译(本质也是写二进制文件)
|
\/
二进制文件
PS: db指令是“data byte"的缩写,也就是往文件里直接写入1个字节的指令,大小写不敏感。(可以说,就是把二进制数据写到一个二进制文件中,只不过是通过汇编语言而已)
方式1和方式2的执行结果都是一样的:
把方式2进行一些优化:
其实就是使用一些别的汇编指令:
resb指令是”reserve byte“的略写,如果想要从现在的地址开始空出10个字节来,就可以写成resb 10,意思是我们预约了这10个字节(大家可以想象成在对号入座的火车里,预定了10个连号座位的情形)。而且nasm不仅仅是把指定的地址空出来,它还
会在空出来的地址上自动填写0x00,所以我们这次就可以用这个指令就可以输出很多0x00,省的我们在写那么多0.
所以在这里,我们需要预约446个字节,16*4+446+2 = 512个字节,修改后的汇编程序如下截图:
执行结果,也是相同的。
方式3:
PS:
DB(data byte)指令
,新用法
DW(data word) :汇编中,word是16位,2个字节
DD
(data double word): 汇编中是 32位,4个字节
RESB 0x1fe-$: 0x1fe是16进制510,
$
是到当前行已经占用了多少个字节了。这里需要用($-$$)替换掉$
代码挨个比较:
声明: 二进制数据默认以16进制形式读写,都是ASCII码
nas: db eb 4e 90
bin: eb 4e 90
nas: db "H E L L O I P L" note: 各个字母之间没有空格,加空格这样做是为了看着和理解方便
bin: 48 45 4c 4c 4f 49 50, 4c
nas: dw 512 note: 2个字节,写512,512的16进制:200,汇编应该是先写低字节00,再写高字节02
bin: 00 02
nas: db 1
bin: 01
nas: dw 1
bin: 01 00
nas: db 2
bin: 02
nas: dw 224 note: 224二进制 e0,e0就是低字节能表达的,所以写出来是e0 00
bin: e0 00
nas: dw 2880
bin: 40 0b
nas: db 0xf0
bin: f0
nas: dw 9
bin: 09 00
nas: dw 18
bin: 12 00
nas: dw 2
bin: 02 00
nas: dd 0
bin: 00 00 00 00
nas: dd 2280
bin: 40 0b 00 00
nas: db 0, 0, 0x29
bin: 00 00 29
nas: dd 0xffffffff
bin: ff ff ff ff
nas: db "H E L L O - O S " note: S字符后面有3个空格,ASCII码是 20
bin: 48 45 4c 4c 4f 2d 4f 53 20 20 20
nas: db "F A T 1 2 " note: 2字符后面有3个空格,ASII码是 20
bin: 46 41 54 31 32 20 20 20
nas: resb 18
bin: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
;程序主体都是db,所以这里略过解释了
;信息显示部分,也就很简单了,略过
;一直到最后,都很简单了,哈哈哈
看下运行结果把: