1.debug的补充
实验一已经初步对debug的命令有了了解,这次主要结合上次所讲的三种段进行操作
- D命令
实验一的D命令用于查看内存单元的命令,简单回顾一下:
"d 段地址:偏移地址"用于查看这个指定地址的内容。
现在我们知道段地址储存在段寄存器中,我们可以换一种方式: "d 段寄存器:偏移地址"
① - D DS:0 // 查看内存区(数据区)的内容
② - D CS:0 // 查看代码区的内容
③ - D SS:0 // 查看栈中的内容
- E,A,U命令
E,A,U命令也可以直接对寄存器进行使用,实验一中这些指令的作用也在此回顾一下:
E指令用于修改内容,A指令是以汇编语言的格式向内存单元写入,U指令是以汇编语言的形式显示代码段中的指令。现在对段寄存器进行操作会更加直观:
① - E DS:0 11 22 33 //向ds中修改内容
② - U CS:0 //将代码段中的机器码显示为汇编指令的形式
③ - A DS:0 // 以汇编指令的形式写入内存单元
2.指令执行中的意外
我们知道CPU执行指令是一条一条执行的,但对于指令:
mov ax,2000 mov ss,ax mov sp,10
我们可以用debug实验一下
可以看得到,第一步要执行的是mov ax,2000,没有问题,第二步执行mov ss,ax也没什么问题,可出现问题的就是第三步 ,为什么没有第三步的执行?翻阅了书籍,明白了第三步和第二步同时执行了(也不能说同时执行,应该说第三步紧接着第二步之后就执行了。当然我们会感到疑惑,为什么会出现这个问题。-----中断机制,我们目前无法理解只能知道当debug的T命令在执行修改寄存器SS的指令时,下一条指令就紧接着被执行了。
3.实现第一个程序(先解释再实验)
简单来说,执行一个简单的程序需要三步,编程--连接--执行,接下来会对以下内容依次解释:
在解释以上内容之前打算先介绍源程序
assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00H
int 21H
codesg ends
end
1.伪指令(由编译器执行)
(1)xxx segment
.......
.......
xxx ends
segment和ends是成对使用的一对伪指令,用于说明一个段的开始和结束(一个汇编程序有多个段,正如前面提到的代码段,数据段和栈段 )
(2) end
end表示一个汇编程序的结束,编译器在遇到end后才会停止否则编译器将无法知道什么时候结束
(3) assume
我们只需要知道assume是将相关的段寄存器和特定用途的段联系在一起,比如:上述代码中CS和codesg这个用来作为代码段的段联系在一起。
以上就是一个简单的源程序,当然我们对于汇编指令的最后两行存在疑惑,其实最后两句代码的作用是程序返回。为什么要程序返回?这与计算机操作系统有关,CPU要将控制权返回给程序才能让这个程序运行。
-
实验部分
1.打开dos的编辑(edit)
可以参考我的编辑内容
接着将文件保存为c:\1.asm
2.编译源程序
首先要找到对应的编译器
【.ASM】已经指明了后缀名,我们输入1也行,一定要指明文件路径,因为上文我们已经定义在这个文件里。【1.OBJ】:后可以输入你要指定生成的文件路径。后面的是生成中间文件,可以忽略完成后就像下图一般
3.连接源程序
那么连接的作用是什么,这里作简单解释:
- 当源程序很大时会被分成多个小的源程序再进行编译,最后用连接将文件连接在一起,生成可执行文件
- 如果程序要调用库文件中的子程序,那么就要将该子程序与该程序生成的目标文件连接在一起
- 用连接程序将机器码处理为可执行文件
4.执行程序
遗憾的是我们的程序并没有向显示屏输入任何信息,但是不要灰心,随着不断地学习,我们将会写出很棒很好的程序,希望我们继续沉下心,进行学习!