一、实验目的
二、实验准备
三、实验内容
1. 实验任务1
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 5 dup(2) 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 12 mov ax, 0b800H 13 mov es, ax 14 15 mov cx, 5 ;设置循环次数5,因为‘Nuist’有五个字母 16 mov si, 0 ;设置(si)=0,ds:si指向‘Nuist’的第一个字母 17 mov di, 0f00h ;起始内存单元地址 18 s: mov al, [si] ;将ASCII码从ds:si所指向的单元中取出 19 and al, 0dfh ;变为大写字母 20 mov es:[di], al ;将数据送入现存地址中 21 mov al, [5+si] ;取出data段的第si+5字节 22 mov es:[di+1], al ;控制输出字符的颜色 23 inc si ;si+1,ds:si指向下一个字母 24 add di, 2 ;di+2 25 loop s ;实现循环 26 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start
②使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。
用r命令查看
执行到程序返回前
③修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 5 dup(2) --> 改成: db 2,3,4,5,6
这里数值的作用是用来控制输出字符的颜色。
2. 实验任务2
1 data segments 2 db 23, 50, 66, 71, 35 3 data ends
1 assume cs:code, ds:data 2 data segment 3 db 23,50,66,71,35 4 data ends 5 code segment 6 start:mov ax,data 7 mov ds,ax 8 mov di,0 9 mov cx,5 10 11 s1:mov ah,0 12 mov al,ds:[di] 13 mov bl,10 14 div bl 15 mov ds:[10+di],al 16 mov ds:[11+di],ah 17 18 mov ah,2 19 mov dl,ds:[10+di] 20 add dl,30h 21 int 21h 22 23 mov ah,2 24 mov dl,ds:[11+di] 25 add dl,30h 26 int 21h 27 28 mov ah,2 29 mov dl," " 30 int 21h 31 inc di 32 loop s1 33 34 mov ax,4c00h 35 int 21h 36 code ends 37 end start
运行结果:
3.实验任务3
教材「实验5 编写、调试具有多个段的程序」(1)
将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。程序源码task3.asm。
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 4 data ends 5 6 stack segment 7 dw 0, 0, 0, 0, 0, 0, 0, 0 8 stack ends 9 10 code segment 11 start: mov ax,stack 12 mov ss, ax 13 mov sp,16 14 15 mov ax, data 16 mov ds, ax 17 18 push ds:[0] 19 push ds:[2] 20 pop ds:[2] 21 pop ds:[0] 22 23 mov ax,4c00h 24 int 21h 25 26 code ends 27 end start
对程序进行编译、连接:
debug调试,用u命令进行反汇编,用g命令执行程序到程序退出前:
①CPU执行程序,程序返回前,data段中的数据为多少?
data段中的数据为:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
②CPU执行程序,程序返回前,cs=076CH 、ss=076BH 、ds=076AH 。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2 ,stack段的段地址为X-1。
4.实验任务4
教材「实验5 编写、调试具有多个段的程序」(2)
将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。程序源码task4.asm。
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h 4 data ends 5 6 stack segment 7 dw 0, 0 8 stack ends 9 10 code segment 11 start: mov ax,stack 12 mov ss, ax 13 mov sp,16 14 15 mov ax, data 16 mov ds, ax 17 18 push ds:[0] 19 push ds:[2] 20 pop ds:[2] 21 pop ds:[0] 22 23 mov ax,4c00h 24 int 21h 25 26 code ends 27 end start
对程序进行编译、连接:
debug调试,用u命令进行反汇编,用g命令执行程序到程序退出前:
①CPU执行程序,程序返回前,data段中的数据为多少?
data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
②CPU执行程序,程序返回前,cs=076CH 、ss=076BH 、ds=076AH 。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
④对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为⌈N/16⌉*16。
5.实验任务5
教材「实验5 编写、调试具有多个段的程序」(3)
将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。程序源码task5.asm。
1 assume cs:code, ds:data, ss:stack 2 3 code segment 4 start: mov ax,stack 5 mov ss, ax 6 mov sp,16 7 8 mov ax, data 9 mov ds, ax 10 11 push ds:[0] 12 push ds:[2] 13 pop ds:[2] 14 pop ds:[0] 15 16 mov ax,4c00h 17 int 21h 18 19 code ends 20 data segment 21 dw 0123h, 0456h 22 data ends 23 24 stack segment 25 dw 0,0 26 stack ends 27 end start
对程序进行编译、连接:
debug调试,用u命令进行反汇编,用g命令执行程序到程序退出前:
①CPU执行程序,程序返回前,data段中的数据为多少?
data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
②CPU执行程序,程序返回前,cs=076AH 、ss=076EH 、ds=076DH 。
③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。
6.实验任务6
教材「实验5 编写、调试具有多个段的程序」(4)
如果将(1)、(2)、(3)题中最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
答:第(3)题中的程序可以正确执行,即task5.exe。如果不指明程序的入口,CPU会按顺序执行,CPU无法自动识别哪些是指令哪些是数据,第(1)和(2)题中开头是数据段,不能直接执行指令,第(3)题是汇编指令段开头,按顺序能够正确执行。
7.实验任务7
1 assume cs:code 2 a segment 3 db 1,2,3,4,5,6,7,8 4 a ends 5 6 b segment 7 db 1,2,3,4,5,6,7,8 8 b ends 9 10 c segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 11 db 8 dup(0) 12 c ends 13 14 code segment 15 start: 16 mov ax,a 17 mov ds,ax 18 mov ax,b 19 mov es,ax 20 mov ax,c 21 mov ss,ax 22 mov bx,0 23 mov cx,8 24 s: mov ax,[bx] 25 mov ss:[bx],ax 26 mov ax,es:[bx] 27 add ss:[bx],ax 28 inc bx 29 loop s 30 mov ax,4c00h 31 int 21h 32 code ends 33 end start
对程序进行编译、连接:
用debug进行调试,用u命令进行反汇编
查看:
8.实验任务8
1 assume cs:code 2 a segment 3 dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh 4 a ends 5 6 b segment 7 dw 8 dup(0) 8 b ends 9 10 code segment 11 start: 12 mov ax,a 13 mov ds,ax 14 mov ax,b 15 mov bx,0 16 mov ss,ax 17 mov sp,16 18 mov cx,8 19 s: push [bx] 20 add bx,2 21 loop s 22 mov ax,4c00h 23 int 21h 24 code ends 25 end start
对程序进行编译、连接:
使用u命令反汇编后再执行:
查看: