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
16 mov ax, stack
17 mov ss, ax
18 mov sp, 16
19
20 mov ah, 4ch
21 int 21h
22 code ends
23 end
-
- 截图:
-
- 问题回答:
(1)在debug中执行到line17结束、line19之前,记录此时:寄存器(DS)=076A,寄存器(SS)=076B,寄存器(CS)=076C。
(2)假设程序加载后,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
11 code segment
12 start:
13 mov ax, data
14 mov ds, ax
15
16 mov ax, stack
17 mov ss, ax
18 mov sp, 8
19
20 mov ah, 4ch
21 int 21h
22 code ends
23 end
-
- 截图:
-
- 问题回答:
(1)在debug中执行到line17结束、line19之前,记录此时:寄存器(DS)=076A,寄存器(SS)=076B,寄存器(CS)=076C。
(2)假设程序加载后,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
11 code segment
12 start:
13 mov ax, data
14 mov ds, ax
15
16 mov ax, stack
17 mov ss, ax
18 mov sp, 20
19
20 mov ah, 4ch
21 int 21h
22 code ends
23 end
-
- 截图:
-
- 问题回答:
(1)在debug中执行到line17结束、line19之前,记录此时:寄存器(DS)=076A,寄存器(SS)=076C,寄存器(CS)=076E。
(2)假设程序加载后,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
-
- 截图:
-
- 问题回答:
(1)在debug中执行到line17结束、line19之前,记录此时:寄存器(DS)=076C,寄存器(SS)=076E,寄存器(CS)=076A。
(2)假设程序加载后,code的段地址是X,则data段的段地址是X+2,stack的段地址是X+4。
- 任务1-5
- 基于上述四个实验任务的实践、观察、总结并回答:
(1)对于如下定义的段,程序加载后,实际分配给该段的内容空间大小是[N/16]*16(上取整)。
1 xxx segment 2 db N dup(0) 3 xxx ends
(2)如果将程序task1_1.asm,task1_2.asm,task1_3.asm,task1_4.asm中,伪指令end start改成end,哪一个程序仍然可以正确执行,结合实践观察得到的结论,分析,说明原因。
答:只有task1_4.asm可以执行。将end start替换成end则意味着程序未指定开始位置,整个代码段(包括数据段)都被当做执行代码来执行,因此执行数据段中的数据自然会出错。
2.任务实验2
- task2.asm汇编源代码:
1 assume cs:code 2 code segment 3 start: 4 mov ax,0b800h 5 mov ds,ax 6 mov bx,0f00h 7 mov cx,80 8 p: mov ds:[bx],0403h 9 inc bx 10 inc bx 11 loop p 12 13 mov ah,4ch 14 int 21h 15 code ends 16 end start
- 截图:
3.任务实验3
- task3.asm汇编源代码:
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 cx,16 19 mov bx,0 20 s: mov al,ds:[bx] 21 add al,ds:[bx+16] 22 mov ds:[bx+32],al 23 inc bx 24 loop s 25 26 mov ah,4ch 27 int 21h 28 code ends 29 end start
- 截图:
- 数据依次加强前截图:
-
- 数据依次相加后截图:
4.任务实验4
- task4.asm汇编源代码:
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(?) 9 data2 ends 10 stack segment 11 db 16 dup(0) 12 stack ends 13 code segment 14 start: 15 mov ax,data1 16 mov ds,ax 17 mov ax,stack 18 mov ss,ax 19 mov sp,16 20 mov bx,0 21 mov cx,8 22 s1: 23 push ds:[bx] 24 inc bx 25 inc bx 26 loop s1 27 28 mov bx,16 29 mov cx,8 30 s2: 31 pop ds:[bx] 32 inc bx 33 inc bx 34 loop s2 35 36 mov ah, 4ch 37 int 21h 38 code ends 39 end start
- 截图:
5.任务实验5
- task5.asm汇编源码:
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 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
- 运行结果截图:
- line25执行之后,line27执行之前的截图:
- 源代码中line19的作用:
答:将所有小写字母转化为大写字母。
- 源代码中data段line4的字节数据的用途:
答:设置字体颜色。
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 p: 21 mov al,ds:[bx+si] 22 or al,00100000B 23 mov ds:[bx+si],al 24 inc si 25 loop p 26 27 add bx,16 28 mov cx,dx 29 loop s 30 31 mov ah, 4ch 32 int 21h 33 code ends 34 end start
- 截图:
7.任务实验7
- task7.asm汇编源代码:
1 assume cs:code, ds:data, es:table 2 3 data segment 4 db '1975', '1976', '1977', '1978', '1979' 5 dw 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 code segment 14 start: 15 mov ax,data 16 mov ds,ax 17 mov ax,table 18 mov es,ax 19 mov si,0 20 mov di,0 21 mov bx,0 22 mov cx,5 23 mov sp,0 24 25 s: mov ax,[si] 26 mov es:[di],ax 27 mov ax,[si+2] 28 mov es:[di+2],ax 29 mov ax,[bx+20] 30 mov es:[di+5],ax 31 mov dx,0 32 mov es:[di+7],dx 33 push cx 34 mov cx,[20+10+bx] 35 mov es:[di+10],cx 36 div cx 37 pop cx 38 mov es:[di+0dh],ax 39 add si,4 40 add di,16 41 add bx,2 42 loop s 43 44 mov ah, 4ch 45 int 21h 46 code ends 47 end start
- 截图:
- table段原始数据信息截图:
-
- 程序退出之前,table段对应的内存空间的截图: