实验3 多个段的汇编源程序编写与调试
一、实验目的
- 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
- 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
- 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
- 理解并掌握各种寻址方式的灵活应用
- 掌握汇编指令loop, and, or,div, mul的用法
二、实验准备
复习教材chapter 6-8章。
三、实验内容
1、实验任务1
使用任意文本编辑器,录入汇编源程序task1.asm。

使用masm、link汇编、链接源程序,运行task1.exe

debug task1.exe得出结果:

修改源代码,重新汇编、链接、执行,得到结果:

问题分析:
通过两次执行的截图,我们可以看出字符串的颜色发生了改变,由此我们可以推出这里的数值作用是控制字符串的颜色。
2、实验任务2
task2.asm:
assume cs:code, ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov di,0 mov cx,5 s1:mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s1 mov ax,4c00h int 21h code ends end start
运行结果:
3.实验任务3
实验代码:
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
debug调试:

由图可得:
data:23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09 CS:076C SS:076B DS:076A 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
4.实验任务4
实验代码:
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 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
debug调试:
由图可得:
data段数据:23 01 56 04
cs:076c ss:076b ds:076a
设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
5.实验任务5
实验代码:
assume cs:code, ds:data, ss:stack 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 data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
debug调试:

由图可得:
data:23 01 56 04
cs:076a ss:076e ds:076d
设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。
6、实验任务6
问题:如果将实验任务3、4、5中的最后一条伪指令"end start"改为"end",则哪个程序仍可以正确运行?请说明原因。
实验任务3和4不能正确执行,只有实验任务6可以正确执行。 这是因为当没有指明程序入口时,end指令从当前的cs:ip值开始进入程序。而在实验任务6中程序以代码段开始,不会将其他数据段当成代码段执行,用r命令查看IP=0,所以能正确执行。
7、实验任务7
实验代码:
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 8 dup(0) c ends code segment start: mov bx,0 mov cx,8 mov ax,a mov ds,ax mov ax,c mov es,ax s: mov dx,0 mov ax,a mov ds,ax add dl, [bx] mov ax,b mov ds,ax add dl,[bx] mov es:[bx],dl inc bx loop s mov ax,4c00h int 21h code ends end start
debug调试

运行结果正确。
8.实验任务8
实验代码:
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax,b mov ss,ax mov sp,10h mov cx,8 s:push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
debug调试:

确实成功放入了。
四、实验总结
- 对数据、代码、栈放入不同的段有了更深的理解。
- 学会了编写、调试有多个段的程序。
浙公网安备 33010602011771号