实验三 多个段的汇编源程序编写与调试
实验3 多个段的汇编源程序编写与调试
一、实验目的
1、理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2、理解具有多个段的汇编源程序对应的目标程序执行时,内存的分配方式
3、掌握大小写字符的转换办法、数字字符和数值之间的转换方法
4、理解并掌握各种寻址方式的灵活应用
5、掌握汇编指令loop,and,or,div,mul的用法
二、实验准备
复习教材chapter6-8章
三、实验结论
1、实验任务1
源程序如下:
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe运行结果如下
使用debug工具进行调试,执行到程序返回前,即line27之前结果如下:
修改line4里面5个字节单元值,重新进行汇编、链接、运行,观察结果
db 5 dup(2) --> 改成: db 2,3,4,5,6
猜测:这里的数值的作用主要是向显存中写入颜色数据
2、实验任务2
已知数据段中定义的字节数据如下:
data segments db 23, 50, 66, 71, 35 data ends
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。
编写源代码如下:
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 cx,5 mov si,0 s: mov ah,0 mov al,[si] mov bl,10 div bl mov bx,ax mov ah,2 or bl,30h mov dl,bl int 21h mov ah,2 or bh,30h mov dl,bh int 21h mov ah,2 mov dl,',' int 21h inc si loop s mov ax,4c00h int 21h code ends end start
运行结果如下
3、实验任务3
task3.asm源代码如下:
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
运行结果如下:
此时查看数据
程序返回前data段中的数据如上图所示
返回前cs=076C ss=076B ds=076A
程序加载后code段的地址为X,则data段的地址为:X-1,stack段的段地址为:X-2
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
运行结果如下
此时查看数据
data数据段中的数据如上图所示
程序返回前,cs=076C、ss=076B、ds=076A
code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
该段实际占有的空间为([N/16]+1)*16
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
运行结果如下:
此时查看数据
data数据段中的数据如上图所示
程序返回前cs=076A,ss=076E,ds=076D
code段的段地址是X,则data段的段地址为X+3,stack段的段地址是X+4
6、实验任务6
只有task5.exe可以正确执行,应为在task5.asm中data段和stack段是定义在程序段的后面的,编译器会顺序执行
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 c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 db 8 dup(0) c1 ends code segment start: mov ax,a mov es,ax mov ax,c1 mov ds,ax mov bx,0 mov cx,8 s1: mov ax,es:[bx] add [bx],ax add bx,2 loop s1 mov ax,b mov es,ax mov bx,0 mov cx,8 s2: mov ax,es:[bx] add [bx],ax add bx,2 loop s2 mov ax,4c00h int 21h code ends end start
运行结果如下:
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,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov bx,0 s: push[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
运行结果如下: