1.debug命令
d: 查看内存数据. eg: d ds:0
u: 汇编代码方式显示内存指令. eg: u cs:0
t: 单步执行CS:IP指示的指令.
a: 修改指定位置的数据
e: 修改指定位置的汇编代码
g: 执行指令直到指定地址,eg: g 0012, 使Debug从当前的CS:IP指向的指令执行,一直到(IP)=0012h为止
p: 情景一,一次执行完一个循环指令(loop), 假如循环100次,如果用t命令那不是得执行100次?
情景二,执行到程序最后的指令int 21h时,需使用p指令,debug将提示“Program terminated normally“
2.debug的t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行
3.以简化的方式进行编译和连接
在编译或链接命令末加上分号,则不询问是否生成中间文件,而是直接生成目标文件
4.在汇编源程序中,数据不能以字母开头,应在字母前加0。如,A000h应写成0A000h。
5.debug和masm对指令的不同处理
(1) 在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[...]”来表示内存单元,如果在“[]”里用一个常量idada直接给出内存单元的领衔地址,就"[]"的前面显式地给出段地址所在的段寄存器。比如
mov al,ds:[0]
如果没有在"[]"的前面显式地给出段地址所在的段寄存器,比如
mov al,[0] ;等效于mov al,0
那么,编译器masm将把指令中的"[idata]"解释为"idata"。
(2) 如果在"[]"里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显式地给出段地址所在的段寄存器。
mov al,[bx] ;等效于mov al,ds:[bx]
6.DOS和其他合法的程序一般不会使用0:200~0:2ff(00200h~002ffh)的256个字节的空间。
7.指令mov ax,[bx+200], 也可以写成下列形式
mov ax, [200+bx]
mov ax, 200[bx]
mov ax,[bx].200
这种方式为高级语言实现数组提供了便利
8. si和di是8086CPU中和bx功能相近的寄存器,但si和di不能够分成两个8位寄存器来使用
9.关于bx、si、di、bp寄存器
(1)在8086中,只有bx、si、di、bp这4个寄存器可以用在"[...]"中来进行内存单元的寻址,其它是错误的。
(2)在[...]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
(3)只要在[...]中使用寄存器bp,而指令中没有显性地给出地址,段地址就默认在ss中。
10.转移指令
转移的目的地址在指令中的jmp指令
jmp short 实现段内短转移,(IP)=(IP)+8位位移(-128~127)
jmp near ptr 实现段内转移(近转移),(IP)=(IP)+16位位移(-32768~32767)
jmp far ptr 实现段间转移(远转移),修改CS与IP的值
jcxz 有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含的位移,而不是目的地址。对IP的修改范围都为:-128~127
11.中断
(1)响应中断的特殊情况
cpu执行完设置ss的指令后,CPU并不响应中断,而是接着执行下一条指令,如
mov ax,1000h
mov ss,ax
mov sp,0
这是为了保护栈顶指针的正确性,sp的设置指令应该紧接在ss的设置之后
d: 查看内存数据. eg: d ds:0
u: 汇编代码方式显示内存指令. eg: u cs:0
t: 单步执行CS:IP指示的指令.
a: 修改指定位置的数据
e: 修改指定位置的汇编代码
g: 执行指令直到指定地址,eg: g 0012, 使Debug从当前的CS:IP指向的指令执行,一直到(IP)=0012h为止
p: 情景一,一次执行完一个循环指令(loop), 假如循环100次,如果用t命令那不是得执行100次?
情景二,执行到程序最后的指令int 21h时,需使用p指令,debug将提示“Program terminated normally“
2.debug的t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行
3.以简化的方式进行编译和连接
在编译或链接命令末加上分号,则不询问是否生成中间文件,而是直接生成目标文件
4.在汇编源程序中,数据不能以字母开头,应在字母前加0。如,A000h应写成0A000h。
5.debug和masm对指令的不同处理
(1) 在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[...]”来表示内存单元,如果在“[]”里用一个常量idada直接给出内存单元的领衔地址,就"[]"的前面显式地给出段地址所在的段寄存器。比如
mov al,ds:[0]
如果没有在"[]"的前面显式地给出段地址所在的段寄存器,比如
mov al,[0] ;等效于mov al,0
那么,编译器masm将把指令中的"[idata]"解释为"idata"。
(2) 如果在"[]"里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显式地给出段地址所在的段寄存器。
mov al,[bx] ;等效于mov al,ds:[bx]
6.DOS和其他合法的程序一般不会使用0:200~0:2ff(00200h~002ffh)的256个字节的空间。
7.指令mov ax,[bx+200], 也可以写成下列形式
mov ax, [200+bx]
mov ax, 200[bx]
mov ax,[bx].200
这种方式为高级语言实现数组提供了便利
8. si和di是8086CPU中和bx功能相近的寄存器,但si和di不能够分成两个8位寄存器来使用
9.关于bx、si、di、bp寄存器
(1)在8086中,只有bx、si、di、bp这4个寄存器可以用在"[...]"中来进行内存单元的寻址,其它是错误的。
(2)在[...]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
(3)只要在[...]中使用寄存器bp,而指令中没有显性地给出地址,段地址就默认在ss中。
10.转移指令
转移的目的地址在指令中的jmp指令
jmp short 实现段内短转移,(IP)=(IP)+8位位移(-128~127)
jmp near ptr 实现段内转移(近转移),(IP)=(IP)+16位位移(-32768~32767)
jmp far ptr 实现段间转移(远转移),修改CS与IP的值
jcxz 有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含的位移,而不是目的地址。对IP的修改范围都为:-128~127
11.中断
(1)响应中断的特殊情况
cpu执行完设置ss的指令后,CPU并不响应中断,而是接着执行下一条指令,如
mov ax,1000h
mov ss,ax
mov sp,0
这是为了保护栈顶指针的正确性,sp的设置指令应该紧接在ss的设置之后