多个逻辑段的汇编源程序编写与调试
多个逻辑段的汇编源程序编写与调试
1. 实验任务1
-
任务1-1
- task1_1.asm源码:
-
1 assume ds:data,cs:code,ss:stack 2 3 data segment 4 db 16 dup(0) 5 data ends 6 7 stack segment 8 db 16 dup(0) 9 stack ends 10 11 code segment 12 start: 13 mov ax,data 14 mov ds,ax 15 mov ax,stack 16 mov ss,ax 17 mov sp,16 18 19 mov ah,4ch 20 int 21h 21 code ends 22 end start
-
- task1_1调试到line17结束、line19之前截图

-
- 问题回答:
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A , 寄存器(SS)= 076B , 寄存器(CS) = 076C 。
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 X-2 , stack的段地址是 X-1 。
-
任务1-2
-
- 任务task1_2.asm源码
-
1 assume ds:data,cs:code,ss:stack 2 data segment 3 db 8 dup(0) 4 data ends 5 6 stack segment 7 db 8 dup(0) 8 stack ends 9 code segment 10 start: 11 mov ax,data 12 mov ds,ax 13 14 mov ax,stack 15 mov ss,ax 16 mov sp,8 17 18 mov ah,4ch 19 int 21h 20 code ends 21 end start
-
- task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

-
- 问题回答
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A , 寄存器(SS)= 076B ,
寄存器(CS) = 076C 。
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 X-2 , stack的段地址是 X-1 。
-
任务1-3
-
- 任务task1_3.asm源码
-
1 assume ds:data,cs:code,ss:stack 2 3 data segment 4 db 20 dup(0) 5 data ends 6 stack segment 7 db 20 dup(0) 8 stack ends 9 code segment 10 start: 11 mov ax,data 12 mov ds,ax 13 14 mov ax,stack 15 mov ss,ax 16 mov sp,20 17 18 mov ah,4ch 19 int 21h 20 code ends 21 end start
-
- task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

-
- 问题回答
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A , 寄存器(SS)= 076C ,
寄存器(CS) = 076E 。
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 X-4 , stack的段地址是 X-2 。
-
任务1-4
-
- 任务task1_4.asm源码
-
1 assume ds:data,cs:code,ss:stack 2 code segment 3 start: 4 mov ax,data 5 mov ds,ax 6 7 mov ax,stack 8 mov ss,ax 9 mov sp,20 10 11 mov ah,4ch 12 int 21h 13 code ends 14 15 data segment 16 db 20 dup(0) 17 data ends 18 19 stack segment 20 db 20 dup(0) 21 stack ends 22 end start
-
- 任务task1_4.asm源码task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

-
- 问题回答:
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = 076C , 寄存器(SS) = 076E ,
寄存器(CS) = 076A 。
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 X+2 , stack的段地址是 X+4 。
-
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 (N/16+1)*16 。
1 XXX segment 2 dp N dup(0) 3 XXX ends
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。
ask1_4.asm仍然可以正确执行。定义的段在不同的位置,有不同的效果。
如代码段定义在最开始,即使不写start:入口程序也可以执行,但如果代码段不在最开始,则必须写上start,
告诉dos程序的执行开始位置。
2. 实验任务2
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数
据03 04。
- 汇编源代码
assume cs:code code segment start: mov ax,0b800h mov ds,ax mov bx,0f00h mov cx,80 s: mov ds:[bx],0403h inc bx inc bx loop s mov ah,4ch int 21h code ends end start
- 运行结果截图
3. 实验任务3
源代码:
1 assume cs:code 2 data1 segment 3 db 50,48,50,50,0,48,49,0,48,49 ;ten numbers 4 data1 ends 5 6 data2 segment 7 db 0,0,0,0,47,0,0,47,0,0 8 data2 ends 9 10 data3 segment 11 db 16 dup(0) 12 data3 ends 13 14 code segment 15 start: 16 mov cx,10 ;循环次数 17 mov dx,0 ;求和寄存器 18 mov bx,0 ;偏移地址 19 20 s: 21 mov dx,0 22 23 mov ax,data1 24 mov ds,ax 25 mov dl,[bx] 26 27 mov ax,data2 28 mov ds,ax 29 add dl,[bx] 30 31 mov ax,data3 32 mov ds,ax 33 mov [bx],dl 34 35 inc bx 36 loop s 37 38 mov ah,4ch 39 int 21h 40 code ends 41 end start
在debug中加载、反汇编、调试截图(要求给出,在数据项依次相加之前,查看逻辑段data1, data2, data3
对应的内存空间数据原始值的debug命令和截图。以及,依次相加之后,查看逻辑段data1, data2, data3对应的
内存空间数据原始值的debug命令和截图):


相加之后的截图:

4. 实验任务4
补充完整后的汇编源代码
1 assume cs:code 2 3 data1 segment 4 dw 2,0,4,9,2,0,1,9 5 data1 ends 6 7 data2 segment 8 dw 8 dup(0) 9 data2 ends 10 11 code segment 12 start: 13 mov ax,data1 14 mov ds,ax 15 mov ax,data2 16 mov ss,ax 17 mov sp,10h 18 19 mov bx,0 20 mov cx,8 21 22 s: push [bx] 23 add bx,2 24 loop s 25 26 mov ah,4ch 27 int 21h 28 code ends 29 end start
在debug中加载、反汇编、调试截图(要求给出,在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。):

5. 实验任务5
task5.asm源码:
1 assume cs:code,ds:data 2 data segment 3 db 'Nuist' 4 db 2,3,4,5,6 5 data ends 6 7 code segment 8 start: 9 mov ax,data 10 mov ds,ax 11 mov ax,0b800h 12 mov es,ax 13 14 mov cx,5 15 mov si,0 16 mov di,0f00h 17 s: mov al,[si] 18 and al,0dfh 19 mov es:[di],al 20 mov al,[5+si] 21 mov es:[di+1],al 22 inc si 23 add di,2 24 loop s 25 26 mov ah,4ch 27 int 21h 28 code ends 29 end start
运行结果截图:

使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27执行之前)的截图:

1.源代码中line19的作用是:将al的第五位置为0,变为大写字母
2.源代码中data段line4的字节数据的用途是:改变字符串NUIST的颜色
6. 实验任务6
task6.asm源代码:
1 assume cs:code, ds:data 2 3 data segment 4 db 'Pink Floyd ' 5 db 'JOAN Baez ' 6 db 'NEIL Young ' 7 db 'Joan Lennon ' 8 data ends 9 10 code segment 11 start: 12 mov ax,data 13 mov ds,ax 14 mov cx,4 15 mov bx,0 16 s: 17 mov dx,cx 18 mov cx,4 19 mov si,0 20 s0: 21 mov al,ds:[bx+si] 22 or al,00100000B 23 mov ds:[bx+si],al 24 inc si 25 loop s0 26 add bx,16 27 mov cx,dx 28 loop s 29 30 mov ah, 4ch 31 int 21h 32 code ends 33 end start
在debug中加载、反汇编、调试截图:(要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。)

7. 实验任务7
task7.asm源码:
2 assume cs:code,ds:data,es:table 3 4 data segment 5 db '1975','1976','1977','1978','1979' ;字符串 4*5 = 20(内存单元数) 6 dw 16,22,382,1356,2390 ;总收入的数据 2*5 = 10 7 dw 3,7,9,13,28 ;雇员人数的5个word型数据 2*5=10 8 data ends 9 10 table segment 11 db 5 dup(16 dup(' ')) ;刚好16个字节 12 table ends 13 14 code segment 15 start: 16 ;data数据 放在ds 17 mov ax,data 18 mov ds,ax 19 mov ax,table 20 mov es,ax 21 22 mov bx,0 23 mov si,0 24 mov di,0 25 mov cx,5 26 27 add di,20 28 29 s: mov ax,[bx] 30 mov es:[si],ax 31 mov ax,[bx+2] 32 mov es:[si+2],ax 33 34 mov ax,[di] 35 mov es:[si+5],ax 36 37 mov ax,[di+10] 38 mov es:[si+10],ax 39 40 mov ax,[di] 41 mov dl,[di+10] 42 div dl 43 mov es:[si+13],al 44 45 add si,16 46 add di,2 47 add bx,4 48 loop s 49 50 mov ax,4c00h 51 int 21h 52 code ends 53 end start
调试截图:

查看table段原始数据信息截图:

在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是否
按要求结构化地写入到指定内存:
实验总结
1、push指令只进行字操作。
2、div指令需要注意除数与被除数的位数,特别的被除数位数过大问题。
浙公网安备 33010602011771号