好玩的汇编编译器NASM:一款基于x86架构的汇编与反汇编软件

好玩的汇编编译器NASM

This is the project webpage for the Netwide Assembler (NASM), an asssembler for the x86 CPU architecture portable to nearly every modern platform, and with code generation for many platforms old and new.

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 <DIR> .

2024/12/11 21:52 <DIR> ..

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或类似的裸机环境下运行。下面是对代码的逐行解释:

  1. org 07c00h:设置程序的起始地址为0x7c00。这是BIOS将引导扇区加载到内存中的地址。引导扇区是硬盘的第一个扇区,用于计算机的启动过程。

  2. mov ax, cs:将代码段寄存器(CS)的值移动到AX寄存器中。CS寄存器包含当前代码段的基地址。

  3. mov ds, ax:将AX寄存器的值(即CS的值)移动到数据段寄存器(DS)中。这样设置DS寄存器,使得后续的内存访问能够正确解析。

  4. mov es, ax:同样,将AX寄存器的值移动到附加段寄存器(ES)中。这通常用于字符串操作或内存块移动指令,但在这个简单的程序中可能不是必需的。

  5. call DispStr:调用DispStr标签处的子程序,用于显示字符串。

  6. jmp $:无限循环。$代表当前指令的地址,所以jmp $会让程序在这里一直循环,不会继续执行后面的代码。

  7. DispStr:DispStr子程序的开始。

  8. mov ax, BootMessage:将BootMessage标签处的地址移动到AX寄存器中。BootMessage是字符串"Hello,World"的地址。

  9. mov bp, ax:将AX寄存器的值(即BootMessage的地址)移动到基指针寄存器(BP)中。BP寄存器常用于基于基址的寻址。

  10. mov cx, 16:设置CX寄存器为16,表示要显示的字符数。这里"Hello,World"加上末尾的空字符共12个字符,但程序中设置的是16,可能是因为包含了额外的空格或为了对齐。

  11. mov ax, 01301h:设置AX寄存器为0x01301,准备调用BIOS中断10h(视频服务)的功能13h(写字符串)。

  12. mov bx, 000ch:设置BX寄存器为0x000C,指定显示页面的属性(这里是亮白色背景上的红色字符)。

  13. mov dl, 0:设置DL寄存器为0,指定字符串的起始行号。

  14. int 10h:调用BIOS中断10h,根据前面的设置显示字符串。

  15. ret:从子程序返回。

  16. BootMessage: db "Hello,World" times 510-($-$$) db 0:定义BootMessage标签,存储字符串"Hello,World"。times 510-($-$$)是用来填充直到引导扇区的510个字节(引导扇区总共512字节,减去前面的代码和这里的字符串所占的字节数)。db 0是字符串的结束符,确保字符串以空字符结尾。

  17. dw 0xaa55:写入引导扇区的最后两个字节为0xAA55,这是BIOS识别有效引导扇区的标志。

综上所述,这段代码的主要目的是在计算机启动时显示"Hello,World"字符串,并通过BIOS中断调用实现。它遵循了BIOS引导扇区的标准格式和约定。

相关推荐
撬动未来的支点4 天前
【汇编】汇编编程中的指令传参方式
汇编
一品人家5 天前
win32汇编环境,窗口程序中组合框的应用举例
汇编
一品人家5 天前
win32汇编环境,窗口程序中单选框的一般操作示例
汇编
hummhumm5 天前
第32章 汇编语言 - 实践项目:小型操作系统内核(一)
开发语言·汇编·数据库·算法·操作系统·程序设计·高级语言
雪碧透心凉_6 天前
Win32汇编学习笔记11.游戏辅助的实现
汇编·笔记·学习
撬动未来的支点7 天前
【汇编】x86汇编编程寄存器资源心中有数
汇编
贺鹏1238 天前
【Redis源码】 RedisObject结构体
汇编·redis
hummhumm8 天前
第27章 汇编语言--- 设备驱动开发基础
开发语言·汇编·后端·程序设计·设备驱动·高级语言·低级语言
雪碧透心凉_10 天前
Win32汇编学习笔记09.SEH和反调试
汇编·笔记·学习
傻童:CPU10 天前
乘法指令mul
汇编