一.实验目的:
1.学习[BX]的用法。
2.熟悉loop的用法,理解loop的执行步骤。
3.掌握如何编写及调试包含多个段的程序
二.实验内容:
1.编程、调试具有多个段的程序(p133)
三.实验步骤
1.将下面的程序编译连接,用debug加载、跟踪,然后回答问题。
Assume cs:code,ds:data,ss:stack
Data segment
Dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
Data ends
stack segment
Dw 0,0,0,0,0,0,0,0
stack ends
Code segment
Start: MOV ax,stack
Mov ss,ax
Mov sp,16
Mov ax,data
Mov ds,ax
Push ds:[0]
Push ds:[2]
Pop ds:2]
Pop ds:[0]
Mov ax,4c00h
Int 21h
Code ends
End start
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:,由图可知,data段中数据为第一行1456:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00
(2)CPU执行程序,程序返回前,cs= 1458h , ss= 1457h , ds= 1456h 。
(3)设程序加载后,code段的段地址为X,则data段的段地址为 X-1 ,stack段的段地址为 X-2 。
2.将下面程序编译连接,用debug加载、跟踪,然后回答问题。(自己把内容和步骤都写全)
(1)步骤:
一:把下图代码粘贴到D盘(自己的下载盘)的masm的文件夹中。
二:先进行编译、然后进行连接、之后用debug调试即可。
三:这里我们使用r命令,可以查看各寄存器的值。
这里cs表示的是code的段地址,ds表示的是data的段地址,ss表示的是stack的段地址。
四:使用u命令。-u
五:使用g命令。-g
六:使用d命令.-d 这时就可以看到data段的值了。
(2)代码如下:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 16 ;ss:sp stack
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21h
code ends
end start
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:,由图可知,data段中数据为第一行1456:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00
(2)CPU执行程序,程序返回前,cs= 1458h , ss= 1457h , ds= 1456h 。
(3)设程序加载后,code段的段地址为X,则data段的段地址为 X-1 ,stack段的段地址为 X-2 。
3.将下面的程序编译连接,用debug加载、跟踪,然后回答问题。(自己把内容和步骤都写全)
(1)步骤:
一:把下图代码粘贴到D盘(自己的下载盘)的masm的文件夹中。
二:先进行编译、然后进行连接、之后用debug调试即可。
三:这里我们使用r命令,可以查看各寄存器的值。
这里cs表示的是code的段地址,ds表示的是data的段地址,ss表示的是stack的段地址。
四:使用u命令。-u
五:使用g命令。-g
六:使用d命令.-d 这时就可以看到data段的值了。
(2)代码如下:
assume cs:code, ds:data, ss:stack
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 16 ;ss:sp stack
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21h
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code ends
end start
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:
由图可知,data段中数据为第一行1456:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00
(2)CPU执行程序,程序返回前,cs= 1456h , ss= 145Ah , ds= 1459h 。
(3)设程序加载后,code段的段地址为X,则data段的段地址为 X+3 ,stack段的段地址为 X+4 。
4.如果将(1)(2)(3)题中的最后一条伪指令 “end start”改为end,则哪个程序仍然可以正确执行?请说明原因。(自己把内容和步骤都写全)
第一个代码如下:
Assume cs:code,ds:data,ss:stack
Data segment
Dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
Data ends
stack segment
Dw 0,0,0,0,0,0,0,0
stack ends
Code segment
Start: MOV ax,stack
Mov ss,ax
Mov sp,16
Mov ax,data
Mov ds,ax
Push ds:[0]
Push ds:[2]
Pop ds:2]
Pop ds:[0]
Mov ax,4c00h
Int 21h
Code ends
End
第二个代码如下:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 16 ;ss:sp stack
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21h
code ends
end
第三个代码如下:
assume cs:code, ds:data, ss:stack
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 16 ;ss:sp stack
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21h
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code ends
end
答:第3个程序可以正确执行。因为如果将“end start”改为"end"的话,这样会使第一个,第二个无法从start处开始执行程序,因此不能正确的设置cs所执行的指令。
- 程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。(自己把内容和步骤都写全)
步骤如下:
- 先进行编译、然后进行连接、之后用debug调试即可。
二.使用d命令,-d,查看c段
三.使用u命令,-u
四.使用g命令,-g
五.使用d命令,-d,查看c段最后结果。
代码如下:
Assume cs:code A segment Db 1,2,3,4,5,6,7,8 A ends B segment Db 1,2,3,4,5,6,7,8 B ends C segment Db 0,0,0,0,0,0,0,0 C ends Code segment Start: ? Code ends End start
结果如下:
- 实验心得
这次实验需要特别注意的是一个字型数据会占用两个字节。前8个字型数据实际占据了16个字节。如果理解成8字节编码就会错误。同时,我们要对逆序保存条件想到栈进行操作。通过这次实验,我学习到了[BX]的用法以及loop的用法,同时,也理解了loop的执行步骤。在修改程序的过程中,如果我们把英文字符写成中文字符,例如:把 “ ,”写成“ ,”,会出现编译错误。最后,也基本掌握了编程、调试具有多个段的程序。