Windows xp以上版本如何调试汇编代码

首先,你要在网上下载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站小甲鱼,大家有兴趣可以去听下他的课,讲的很好,也很风趣,由于原本就是免费课程,所以我这里应该也构不成侵犯知识产权吧。。。就当宣传宣传好了…

发布了78 篇原创文章 · 获赞 3 · 访问量 5596

猜你喜欢

转载自blog.csdn.net/qq_43071318/article/details/104968805