NASM写汇编程序并在dosbox中运行

参考:https://blog.csdn.net/fanghailiang2016/article/details/83343773

1.环境安装准备

1.NASM安装

从https://www.nasm.us/pub/nasm 选择相应的版本进行安装

2.dosbox安装

从https://www.dosbox.com/download.php?main=1 选择相应的版本安装

2.测试代码准备

在worksapce目录下新建helloworld.asm文件,写入如下内容:

org 0100h		;PSP前缀,程序从0100h开始运行
mov	ax, cs		;初始化 ds和dx寄存器,为调用9号程序(显示字符串)做准备
mov	ds, ax
mov dx, string	;取偏移地址,等价于MASM的 lea dx, string 或 mov dx, offset string
mov ah, 9
int 21h
MOV AH,4CH		;回到操作系统
INT 21H
string		db	"Hello, OS world!$"

3.编译程序

  1. 打开cmd.exe
  2. d: 进入dpan
  3. cd workaspace 进入workspace目录
  4. 使用编译命令 nasm helloworld.asm -o helloworld.com

4.运行程序

  1. 打开dosbox
    NASM写汇编程序并在dosbox中运行_第1张图片

  2. 使用命令

mount d D:\workspace

挂在目录

d:

切换到d盘
输入hello使用tab补全,运行:
NASM写汇编程序并在dosbox中运行_第2张图片不知道为什么使用helloworld.com会出错.

5.DEBUG程序

参考:https://blog.csdn.net/sxl18269199707/article/details/83315447
https://blog.csdn.net/emoheithree/article/details/51232793

在dosbox中debug程序需要debug工具.

感谢友军提供的工具链接:
https://pan.baidu.com/s/1m8ZZM1y1BHkMOQdFHSB61A
密码:mieg

首先在dosbox中挂载debug.exe(我的目录为D:\workspace\dosbox\tools)程序目录:

mount c D:\worksapce\dosbox\tools

再切换到c盘:

c:

然后就可以debug相应目录的程序了:

debug D:\pmtest1.com

部分debug命令参考:debug命令
NASM写汇编程序并在dosbox中运行_第3张图片至此,完成汇编开发环境的配置.nice!

debug中遇到的问题

1.debug时出现的DB 66和DB C1

参考:https://blog.csdn.net/xiunai78/article/details/2527885
“db 66”的本意是存储一个值为66H的字节。当在Debug反汇编时,它不能识别这个80386才引入的汇编指令,所以就如此显示。
“66”这个机器代码,是16、32位指令切换的前缀。例如,对于“mov ax,bx”指令,在16位段中的机器代码是“8B C3”;而在32位段中使用该指令,其机器代码是“66 8B C3”。32位段中机器代码“8B C3”对应的指令是“mov ax,ebx”,该指令用在16位段中,其机器代码是“66 8B C3”。

2.文件格式

参考:https://www.cnblogs.com/xiaolongxia/articles/2673043.html

1、dos下,exe有个512字节的文件头,包含重定位信息,后面跟程序;com就是程序的内存映象,没有文件头,偏移地址固定100h;其它不知道

2、exe可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定…
com程序将代码、数据和堆栈段合一,结构紧凑,所有代码、数据都在一个逻辑段内,不超过64KB…
com文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息,与exe文件相比其加载速度更快,占用的磁盘空间也少…

你可能感兴趣的:(操作系统)