首先,你要在网上下载DOS-BOX程序
下载链接:DOS-BOX
其次,你要下载debug
下载链接:debug
提取码:bx0s
然后,要下载nodepad++,做为编写汇编代码的IDE
下载链接:nodepad++
都下载完毕后,你需要新建一个文件夹,专门用来放汇编程序,该文件夹的整个打开路径中不要有中文,不妨就在D盘或E盘下面新建一个名为ASM的文件夹
然后将DOSBOX文件夹放进来
再把windows debug文件夹里面的所有文件都放进来(其中windows debug文件夹中最重要的是这三个程序:debug.exe、masm.exe、link.exe)
接下来,进入DOSBox文件夹
点开那个黄黄的exe文件,你会看到这样的界面
然后,在进行任何操作之前,你要先要进行挂载操作,就是在那个小屏幕内先输入mount e e:\asm
其中第一个e指的是你要在哪个虚拟盘上进行操作,看你心情,26个字母都可以。E:\ASM指的是你存放debug程序的位置,如果你把debug程序放在了别的位置(路径中不能有中文),就要进行相应的动。
mount e e:\asm
这句话也可以放在options.bat文件中,这样每次打开DOSBox时就不用都要重写一遍了。
然后,你可以进入DOSBox.exe测试一下,先输入e:回车,再输入debug回车,再输入r指令查看一下寄存器当前位置
其中r指令用来查看寄存器当前状态,在这个控制台下,你也可以用a指令逐条输入汇编指令
控制台调试短小的汇编程序没有问题,当你需要调试稍长些的汇编代码时,最好还是先将程序代码写好,再编译运行与调试。
这里,就要用到nodepad++了。首先在当前ASM文件夹内为你要编写的汇编程序新建一个文件夹,并不要用中文来命名该文件夹。比如新建一个文件夹“40”。
当然,管理自己的文件时,最好用有意义的英文单词或短语缩写来进行命名,我这里没有这样做主要原因是。。。唉,英语没学好,编程两行泪啊。。。
点开这个文件夹,新建一个名为“40.asm"的文件:
(注意,要想更迅捷地使用自己的电脑,应当勾选文件扩展名!)
右键选择用nodepad++打开
编写完后,要把debug文件夹内的那些文件在放到这个文件夹里面:
然后再打开DOSBox.exe,输入e:回车(你挂载的那个盘符),再用cd命令进入这个文件夹cd 40
回车
然后用masm命令进行编译,输入masm 40.asm
后回车三次
如果编译没有出错,用link指令进行链接生成可执行文件.exe
输入link 40.obj
后回车三次
然后你可以输入debug 40.exe来进行调试
在debug模式下,我最常用的有这几个指令:-r显示当前寄存器状态,也就是上面这种
-t单步执行:
-d 物理地址查看寄存器内部数据
以及-p指令,遇到循环时可以显示整个循环执行完毕后的结果,-q退出指令
当然,除了debug调试外,你也可以在可执行文件生成后直接输入 程序名.exe 来运行程序,一般只要瞬间回到当前文件夹就说明程序正常运行并正常退出:
这里给大家附上一段程序,功能是在指定位置用指定颜色显示字符串
;在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
;(cl)=颜色,ds:si指向字符串的首地址
;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串
assume cs:code, ds:data
data segment
db 'Welcome to masm!', 0
data ends
code segment
start:
mov dh, 8 ;(dh)=行号(取值范围0~24)
mov dl, 3 ;(dl)=列号(取值范围0~79)
mov cl, 2 ;(cl)=颜色
mov ax, data
mov ds, ax
mov si, 0
call show_str
mov ax, 4c00H
int 21H
show_str:
push cx
push si
mov al, 0A0H ;每行有80*2==160个字节==0A0H个字节
dec dh ;行号在显存中从0开始,所以减1
mul dh ;相当于从第(n-1)*0A0H个Byte单元开始
mov bx, ax ;定位好的位置偏移地址存放在bx里(行)
mov al, 2 ;每个字符占两个字节
mul dl ;定位列,结果ax存放的是定位好的列的位置
sub ax, 2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
add bx, ax ;此时bx中存放的是行与列号的偏移地址
mov ax, 0B800H ;显存开始的地址
mov es, ax ;es中存放的是显存的第0页(共0--7页)的起始的段地址
mov di, 0 ;di指向显存的偏移地址,确定指向下一个要处理的字符的位置
mov al, cl ;cl是存放颜色的参数,这时候al存放颜色了
mov ch, 0 ;下边cx存放的是每次准备处理的字符
s: mov cl, ds:[si] ;ds:[si]指向“Welcome to masm", 0
jcxz ok ;当cl的值为0的时候,cx == 0,则发生跳转,到ok处结束处理
mov es:[bx+di], cl ;偶地址存放字符
mov es:[bx+di+1], al ;奇地址存放字符的颜色属性
inc si ;指向下个字符
add di, 2 ;指向下个字符
jmp short s ;无条件跳转,jcxz是离开的关键跳转
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】
code ends
end start
程序运行结果是这样滴:
附:本文用到的两个示例程序均来自b站小甲鱼,大家有兴趣可以去听下他的课,讲的很好,也很风趣,由于原本就是免费课程,所以我这里应该也构不成侵犯知识产权吧。。。就当宣传宣传好了…