实验2 多个逻辑段的汇编源程序编写与调试
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 code segment 11 start: 12 mov ax, data 13 mov ds, ax 14 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 3 data segment 4 db 4 dup(0) 5 data ends 6 7 stack segment 8 db 8 dup(0) 9 stack ends 10 code segment 11 start: 12 mov ax, data 13 mov ds, ax 14 15 mov ax, stack 16 mov ss, ax 17 mov sp, 8 18 19 mov ah, 4ch 20 int 21h 21 code ends 22 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 7 stack segment 8 db 20 dup(0) 9 stack ends 10 code segment 11 start: 12 mov ax, data 13 mov ds, ax 14 15 mov ax, stack 16 mov ss, ax 17 mov sp, 20 18 19 mov ah, 4ch 20 int 21h 21 code ends 22 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调试到line9结束、line11之前观察寄存器DS, CS, SS值的截图
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = 076C, 寄存器(SS) =076E,
寄存器(CS) = 076A。
② 假设程序加载后,code段的段地址是X,则data段的段地址是X+2, stack的段地址是X+4。
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 2*[N/16] B。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。
程序task1_4.asm可以正确执行,因为end start指明了程序从start开始执行,不指定默认CS为DS+10H,只有task1_4.asm的程序段在最上面,可以正确执行,其余会出错,如图
2. 实验任务2
汇编源代码
1 assume cs:code 2 3 code segment 4 start: 5 mov ax,0b800h 6 mov ds,ax 7 mov ax,0403h 8 mov bx,0f00h 9 mov cx,50h 10 s: 11 mov [bx],ax 12 add bx,2 13 loop s 14 15 mov ah,4ch 16 int 21h 17 code ends 18 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 ; ten numbers 8 data2 ends 9 10 data3 segment 11 db 16 dup(0) 12 data3 ends 13 14 code segment 15 start: 16 mov ax,data1 17 mov ds,ax 18 mov bx,0 19 mov cx,0ah 20 s: 21 mov ax,[bx] 22 add ax,10h[bx] 23 mov 20h[bx],ax 24 inc bx 25 loop s 26 27 mov ah,4ch 28 int 21h 29 code ends 30 end start
在debug中加载、反汇编、调试截图
相加前:
相加后:
4. 实验任务4
补充完整后的汇编源代码
1 assume cs:code,ss:stack 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(?) 9 data2 ends 10 11 stack segment 12 dw 8 dup(?) 13 stack ends 14 15 code segment 16 start: 17 mov ax,stack 18 mov ss,ax 19 mov sp,8 20 21 mov ax,data1 22 mov ds,ax 23 mov bx,0 24 mov cx,8 25 s: 26 push [bx] 27 add bx,2 28 loop s 29 30 mov ax,data2 31 mov ds,ax 32 mov bx,0 33 mov cx,8 34 s2: 35 pop [bx] 36 add bx,2 37 loop s2 38 39 mov ah, 4ch 40 int 21h 41 code ends 42 end start
存储前:
存储后:
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 12 mov ax, 0b800H 13 mov es, ax 14 15 mov cx, 5 16 mov si, 0 17 mov di, 0f00h 18 s: mov al, [si] 19 and al, 0dfh 20 mov es:[di], al 21 mov al, [5+si] 22 mov es:[di+1], al 23 inc si 24 add di, 2 25 loop s 26 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start
运行结果截图
使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27
执行之前)的截图
源代码中line19的作用是?
小写字母变成大写
源代码中data段line4的字节数据的用途是?
添加字体颜色
6. 实验任务6
task6.asm源代码
1 assume cs:code, ds:data, ss:stack 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 stack segment 11 dw 1 dup(?) 12 stack ends 13 14 code segment 15 start: 16 mov ax,stack 17 mov ss,ax 18 mov sp,1 19 20 mov ax,data 21 mov ds,ax 22 23 mov ax,data 24 mov es,ax 25 mov cx,4 26 s: 27 push cx 28 mov bx,0 29 mov cx,4 30 31 s2: 32 mov al,es:[bx] 33 or al,20h 34 mov es:[bx],al 35 inc bx 36 loop s2 37 38 pop cx 39 mov ax,es 40 inc ax 41 mov es,ax 42 43 loop s 44 45 mov ah, 4ch 46 int 21h 47 code ends 48 end start
在debug中加载、反汇编、调试截图
要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。
7. 实验任务7
task7.asm源码
1 assume cs:code, ds:data, es:table,ss:stack 2 3 data segment 4 db '1975', '1976', '1977', '1978', '1979' 5 dd 16, 22, 382, 1356, 2390 6 dw 3, 7, 9, 13, 28 7 data ends 8 9 table segment 10 db 5 dup( 16 dup(' ') ) ; 11 table ends 12 13 stack segment 14 dw 1 dup(?) 15 stack ends 16 17 code segment 18 start: 19 mov ax,stack 20 mov ss,ax 21 mov sp,1 22 mov ax,data 23 mov ds,ax 24 mov ax,table 25 mov es,ax 26 27 mov di,0;data 28 29 ;1 30 mov bx,0;table 31 mov si,0;table 32 mov cx,5 33 year: 34 push cx 35 mov cx,4 36 37 year2: 38 mov al,ds:[di] 39 mov es:[bx+si],al 40 inc si 41 inc di 42 loop year2 43 44 pop cx 45 add bx,10h 46 mov si,0 47 loop year 48 49 ;2 50 mov bx,0 51 mov si,5 52 mov cx,5 53 income: 54 push cx 55 mov cx,4 56 57 income2: 58 mov al,ds:[di] 59 mov es:[bx+si],al 60 inc si 61 inc di 62 loop income2 63 64 pop cx 65 add bx,10h 66 mov si,5 67 loop income 68 69 ;3 70 mov bx,0 71 mov si,10 72 mov cx,5 73 num: 74 push cx 75 mov cx,2 76 77 num2: 78 mov al,ds:[di] 79 mov es:[bx+si],al 80 inc si 81 inc di 82 loop num2 83 84 pop cx 85 add bx,10h 86 mov si,10 87 loop num 88 89 ;4 90 mov bx,0 91 mov si,5 92 mov cx,5 93 cal: 94 mov ax,word ptr es:[bx+si] 95 add si,2 96 mov dx,word ptr es:[bx+si] 97 add si,3 98 div word ptr es:[bx+si] 99 add si,3 100 mov word ptr es:[bx+si],ax 101 102 add bx,10h 103 mov si,5 104 loop cal 105 106 mov ah, 4ch 107 int 21h 108 code ends 109 end start
调试截图
查看table段原始数据信息截图
在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是
否按要求结构化地写入到指定内存