好玩的汇编编译器NASM:一款基于x86架构的汇编与反汇编软件
好玩的汇编编译器NASM:一款基于x86架构的汇编与反汇编软件
好玩的汇编编译器NASM
Netwide Assembler(NASM)是一种可移植到几乎所有现代平台的x86 CPU架构的组装器,并为许多新旧平台生成代码。
网址:NASM
下载安装NASM
下载页面: Index of /pub/nasm/releasebuilds/2.16.03
下载后解压即可使用。
写代码
写段代码:
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "Hello,World"
times 510-($-$$) db 0
dw 0xaa55
保存为boot.asm
编译:
nasm.exe boot.asm -o boot.bin
看看编译完成的文件:
E:\work\os>dir
驱动器 E 中的卷是 新加卷
卷的序列号是 CA89-671D
E:\work\os 的目录
2024/12/11 21:52
2024/12/11 21:52
2024/12/11 21:44 312 boot.asm
2024/12/11 21:52 512 boot.bin
写入磁盘映像img
使用FloppyWriter软件,将boot.bin文件写入Image。
下载FloppyWriter软件
FloppyWriter/Release at master · huangyingw/FloppyWriter · GitHub
下载之后安装即可使用。
打开FloppyWriter软件,选择刚才编译好的的boot.bin,写入文件,测试下来需要打开一个*.img文件,
所以可以先创建一个newos.img的空白文件,写入的时候选中它就行了
写入完成:
2024/12/11 22:10 512 newos.img
虚拟机运行
用VirtualBox创建一个新的64位虚拟机,磁盘选择newos.img
然后启动虚拟机,启动成功!
汇编代码解读
百度AI探索版对代码的解读:
这段代码是一段简单的汇编语言程序,用于在启动计算机时显示一段文本("Hello,World")。它是为BIOS中断调用和x86架构编写的,特别是为了在DOS或类似的裸机环境下运行。下面是对代码的逐行解释:
org 07c00h
:设置程序的起始地址为0x7c00。这是BIOS将引导扇区加载到内存中的地址。引导扇区是硬盘的第一个扇区,用于计算机的启动过程。
mov ax, cs
:将代码段寄存器(CS)的值移动到AX寄存器中。CS寄存器包含当前代码段的基地址。
mov ds, ax
:将AX寄存器的值(即CS的值)移动到数据段寄存器(DS)中。这样设置DS寄存器,使得后续的内存访问能够正确解析。
mov es, ax
:同样,将AX寄存器的值移动到附加段寄存器(ES)中。这通常用于字符串操作或内存块移动指令,但在这个简单的程序中可能不是必需的。
call DispStr
:调用
DispStr
标签处的子程序,用于显示字符串。
jmp $
:无限循环。
$
代表当前指令的地址,所以
jmp $
会让程序在这里一直循环,不会继续执行后面的代码。
DispStr:
:
DispStr
子程序的开始。
mov ax, BootMessage
:将
BootMessage
标签处的地址移动到AX寄存器中。
BootMessage
是字符串"Hello,World"的地址。
mov bp, ax
:将AX寄存器的值(即
BootMessage
的地址)移动到基指针寄存器(BP)中。BP寄存器常用于基于基址的寻址。
mov cx, 16
:设置CX寄存器为16,表示要显示的字符数。这里"Hello,World"加上末尾的空字符共12个字符,但程序中设置的是16,可能是因为包含了额外的空格或为了对齐。
mov ax, 01301h
:设置AX寄存器为0x01301,准备调用BIOS中断10h(视频服务)的功能13h(写字符串)。
mov bx, 000ch
:设置BX寄存器为0x000C,指定显示页面的属性(这里是亮白色背景上的红色字符)。
mov dl, 0
:设置DL寄存器为0,指定字符串的起始行号。
int 10h
:调用BIOS中断10h,根据前面的设置显示字符串。
ret
:从子程序返回。
BootMessage: db "Hello,World" times 510-($-$$) db 0
:定义
BootMessage
标签,存储字符串"Hello,World"。
times 510-($-$$)
是用来填充直到引导扇区的510个字节(引导扇区总共512字节,减去前面的代码和这里的字符串所占的字节数)。
db 0
是字符串的结束符,确保字符串以空字符结尾。
dw 0xaa55
:写入引导扇区的最后两个字节为0xAA55,这是BIOS识别有效引导扇区的标志。
综上所述,这段代码的主要目的是在计算机启动时显示"Hello,World"字符串,并通过BIOS中断调用实现。它遵循了BIOS引导扇区的标准格式和约定。