问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://m.blog.csdn.net/skywalk8163/article/details/144411254

好玩的汇编编译器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引导扇区的标准格式和约定。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号