01-第一个汇编程序
在阅读《x86汇编语言-从实模式到保护模式》
这本书的时候,从B站上看到视频教程,使用虚拟机然后将汇编文件写入磁盘0面0扇区,然后启动,在屏幕输出字符,
这个程序本身就很简单,之前学习过王爽的汇编,知道显存位置08b00H,字低8位是ASCII编码,高8位是字符的颜色
但是在看视频的代码,发现不同之处
mov byte [di], 'l',没有ptr关键字,这个是不明白的地方,可能是学习王爽汇编时,使用的是DosBox这个编译,书里使用的是NASM汇编- 程序末尾的三行代码不知道什么用以,以前是
mov ax, 4c00H int 21H代表程序结束返回之前程序
反正也是初学,后续慢慢来,会明白最后三行代码的具体用意
mov ax, 0b800H
mov es, ax
mov di, 0
mov byte es:[di], 'h'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 'e'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 'l'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 'l'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 'o'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], ','
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 'a'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 's'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], 'm'
inc di
mov byte es:[di], 2
inc di
mov byte es:[di], '!'
inc di
mov byte es:[di], 2
inc di
;下面这三行不知道是什么用意,但只有加上这三行才能在虚拟机中跑起来
jmp $
times 510-($-$$) db 0
db 0x55, 0xaa
; $一个这个符号:等同于标号,他是隐藏在行首的标号
; $$ 是NASM汇编提供的另一种标号,代表当前汇编端的起始地址
; 最后用510-减去实际程序大小,就是要填充的字节数 最后规定的末尾字节必须是0x55 0xaa
编写好之后,使用nasm -f bin hello.asm -o hello.bin
编译之后使用fixvhdw2工具写入虚拟机的.hdv文件,然后启动

写入之后程序正常运行

后续
程序和工具都有了,其实从好几天前就开始读这本书,之前没有工具,使用的是vs code上的masm/tasm插件,直接运行,但是和书里不一样的话,怕有些步骤学不到有写问题遇到了没有人给解决
然后就是程序不明白的地方,
- 就是最后三条代码不知道什么用意,如果是之前的assume ends 这些开头结尾我还知道是干什么,去掉这三条代码的话 写入虚拟机 提示没有启动盘什么的....
- 接下来有个考试 汇编学习只能先放一放了

浙公网安备 33010602011771号