汇编语言DosBox下在64位上运行实现编译(masm)调试即debug命令
首相运行dosbox,可以通过点击exe文件或者使用cmd(Windows +r,可以调出运行框,然后就是输入cmd就可以),下面进入正题:
据我所知有两种方法实现masm:
找到asm文件右击选择默认打开方式,然后将方式改为dosbox就可以了:接下来就是:
masm ****.asm(无错误提示的话,连续按三个回车)
link ****.obj
*****.exe
这样就可以了。
第二种方法有点麻烦:
首先得通过mount命令将你源文件所在位置转化为c盘;
然后masm(同上):
DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。初学者可以直接在DEBUG环境下执行汇编指令。
2.1 DEBUG程序使用
在DOS提示符下键入命令:
C>DEBUG [盘符:][路径][文件名.EXE][参数1][参数2]
这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试。若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG程序调入内存后,再由DEBUG将指定的文件名装入内存。
每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作参数与命令符之间用空格隔开,命令的结束符是回车键。DEBUG中所用数均为十六进制数,所以后面不用加H。
2.2 DEBUG的常用命令
1汇编命令 A
格式:A[起始地址]
功能:将输入源程序的指令汇编成目标代码并从指定地址单元开始存放。若缺省起始地址,则从当前CS:100地址开始存放。A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。
例如:
-A 100
18E4:0100 mov ax,1234
18E4:0103 add ax,5
18e4:0105 (回车)
2 反汇编命令 U
格式1:U[起始地址]
格式2:U[起始地址][结束地址|字节数]
功能:格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式,缺省起始地址,则从当前地址CS:IP开始。
格式2将指定范围的内存单元中的目标代码转换成汇编指令。
例如:
-u100
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70608020202 MOV WORD PTR[0208],0202
18E4:0112 BB0402 MOV BX,0204
18E4:0115 E80200 CALL 011A
18E4:0118 CD20 INT 20
18E4:011A 50 PUSH AX
18E4:011B 51 PUSH CX
18E4:011C 56 PUSH SI
18E4:011D 57 PUSH DI
18E4:011E 8B37 MOV SI,[BX]
3显示、修改寄存器命令 R
格式:R[寄存器名]
功能:若给出寄存器名,则显示该寄存器的内容并可进行修改。缺省寄存器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。
AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000
DI=0000 DS=3000 ES=23A0 CS=138E IP=0000
NV UP DI PL NZ NA PO NC
138E:0000 MOV AX,1234
-R AX ;输入命令
AX 0014 ;显示AX的内容
: ;供修改,不修改按回车。
若对标志寄存器进行修改,输入:-RF
屏幕显示如下信息,分别表示OF、DF、IF、SF、ZF、AF、PF、CF的状态。
NV UP DI PL NZ NA PONC
不修改按回车键。要修改需个别输入一个或多个此标志的相反值,再按回车键。R命令只能显示、修改16位寄存器。
4显示存储单元命令 D
格式1:D[起始地址]
格式2:D[起始地址][结束地址|字节数]
功能:格式1从起始地址开始按十六进制显示80H个单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASCII码,不可显示的ASCII码则显示“·”。格式2显示指定范围内存储单元的内容,其他显示方式与格式1一样。如果缺省起始地址或地址范围,则从当前的地址开始按格式1显示。
例如,按指定范围显示存储单元内容的方法为:
-D 100 120
067C:0100 C7 D7 0D 0A 32 33 33 34 - D5 C5 B4 C630 10 42 0C ....2334....0.B.
067C:0110 03 41 4243 44 45 46 47 - 48 49 4A 4B 4C 4D 4E 4F .ABCDEFGHIJKLMNO
067C:0120 8B
其中0100至0120是DEBUG显示的单元内容。 左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,“.”表示不可显示的字符。这里没有指定段地址, D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令的最后一个单元的内容。
说明:在DEBUG中,地址表示方式有如下形式:
段寄存器名:相对地址,如:DS:100
段基值:偏移地址(相对地址),如:23A0:1500
5 修改存储单元命令 E
格式1:E[起始地址] [内容表]
格式2:E[地址]
功能:格式1按内容表的内容修改从起始地址开始的多个存储单元内容,即用内容表指定的内容来代替存储单元当前内容。
例如:-E DS:0100 'VAR' 12 34
表示从DS:0100 为起始单元的连续五个字节单元内容依次被修改为
'V'、'A'、'R'、12H、34H。
格式2是逐个修改指定地址单元的当前内容。
如:-E DS:0010
156F:0010 41.5F
其中156F:0010单元原来的值是41H,5FH为输入的修改值。若只修改一个单元的内容,这时按回车键即可;若还想继续修改下一个单元内容,此时应按空格键,就显示下一个单元的内容,需修改就键入新的内容,不修改再按空格跳过,如此重复直到修改完毕,按回车键返回DEBUG“-”提示符。如果在修改过程中,将空格键换成按“-”键,则表示可以修改前一个单元的内容。
6 运行命令 G
格式:G[=起始地址][第一断点地址[第二断点地址……]]
功能:CPU从指定起始地址开始执行,依次在第一、第二等断点处中断。若缺省起始地址,则从当前CS:IP指示地址开始执行一条指令。最多可设置10个断点。
7 跟踪命令 T
格式:T[=起始地址][正整数]
功能:从指定地址开始执行‘正整数’条指令,若缺省‘正整数’,表示执行一条指令,若两项都缺省,表示从当前CS:IP指示地址开始执行一条指令。
8跟踪命令 P
格式:-P[=地址]
从指定地址起执行一条指令后停下来,显示所有寄存器内容、标志位的值和下一条要执行的指令地址和指令内容。如未指定地址则从当前的CS:IP开始执行。
9 指定文件命令 N
格式:N<文件名或扩展名>
功能:指定即将调入内存或从内存写入磁盘的文件名。该命令应该用在L命令和W命令之前。
10 装入命令 L
格式1:L[起始地址][盘符号][扇区号][扇区数]
格式2:L[起始地址]
功能:格式1根据盘符号,将指定扇区的内容装入到指定起始地址的存储区中。
格式2将N命令指出的文件装入到指定起始地址的存储区中,若省略起始地址,则装入到CS:100处或按原来文件定位约定装入到相应位置。
11 写磁盘命令 W
格式1:W<起始地址>[驱动器号]<起始扇区><扇区数>
格式2:W[起始地址]
功能:格式1把指定地址开始的内容数据写到磁盘上指定的扇区中。
格式2将起始地址的BX×10000H+CX个字节内容存放到由N命令指定的文件中。在格式2的W命令之前,除用N命令指定存盘的文件名外,还必须将要写的字节数用R命令送入BX和CX中。
12 退出命令 Q
格式:Q
功能:退出DEBUG,返回到操作系统。
下面再来说说debug命令: