汇编语言第二次实验
1. 实验任务1
- 任务1-1
task1_1.asm源码
1 assume ds:data, cs:code, ss:stack 2 3 data segment 4 db 16 dup(0) ; 预留16个字节单元,初始值均为0 5 data ends 6 7 stack segment 8 db 16 dup(0) ;预留16个字节单元,初始值均为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
调试到line17结束、line19之前截图:
① 此时(DS)=076A,(SS)=076B,(CS)=076C。
②若程序加载后,code段的段地址是X,则data的段地址是X-32,stack的段地址是X-16。
-
任务1-2
task1_2.asm源码
1 assume ds:data, cs:code, ss:stack 2 data segment 3 db 4 dup(0) ; 预留4个字节单元,初始值均为0 4 data ends 5 6 stack segment 7 db 8 dup(0) ; 预留8个字节单元,初始值均为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
调试到line17结束、line19之前的截图:
①此时(DS)=076A,(SS)=076B,(CS)=076C。
②若程序加载后,code段的段地址是X,则data的段地址是X-32,stack的段地址是X-16。
-
任务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
调试到line17结束、line19之前的截图:
①此时(DS)=076A,(SS)=076C,(CS)=076E。
②若程序加载后,code段的段地址是X,则data的段地址是X-64,stack的段地址是X-32。
-
任务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值的截图
①此时(DS)=076C,(SS)=076E,(CS)=076A。
②若程序加载后,code段的段地址是X,则data的段地址是X+32,stack的段地址是X+64
-
任务1-5
①实际分配给该段的内存空间大小是N%16==0? N : N/16*16+16 个字节
②task1_4仍然可以正确执行。end start指示了程序执行入口,task1_4的代码段在程序开头,end start改成end仍可以正常执行。
2.实验任务2
-
汇编源代码
1 assume cs:code 2 3 code segment 4 start: 5 mov ax, 0b800h 6 mov ds, ax 7 mov bx, 0f00h 8 9 mov cx, 80 10 s:mov [bx], 0403h 11 add bx, 2 12 loop s 13 14 mov ah, 4ch 15 int 21h 16 code ends 17 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 ss, ax 18 mov ax, data2 19 mov es, ax 20 mov ax, data3 21 mov ds, ax 22 mov bx, 0 23 24 mov cx, 10 25 s:mov al, ss:[bx] 26 add al, es:[bx] 27 mov [bx], al 28 add bx, 1 29 loop s 30 31 mov ah, 4ch 32 int 21h 33 code ends 34 end start
- 调试至循环开始之前,用d命令查看逻辑段data1,data2的内容:
- 调试至循环结束,查看目标逻辑段的内容:
容易发现,程序功能完成。数据代表的日期的分隔符号“.”被替换成了“/”。
4.实验任务4
- task4.asm
1 assume cs:code, ss:data1, ds:data2 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 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 mov bx, 0 19 20 mov cx, 8 21 s:push [bx] 22 add bx, 2 23 loop s 24 25 mov ah, 4ch 26 int 21h 27 code ends 28 end start
- 调试到循环结束后的截图:
用d命令查看循环执行前后的内存空间,发现data1的内容确实被逆序复制到了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 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
- 运行结果截图:
- 调试至程序返回前截图:
- 源代码中line19将存储单元内的数据和二进制数11011111逐位相与,即将小写字母转换为大写字母。
- 源代码中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 bx, 0 15 16 mov cx, 4 17 s:mov ax, cx 18 mov cx, 4 19 20 t:or byte ptr [bx], 20h 21 inc bx 22 loop t 23 24 add bx, 12 25 mov cx, ax 26 loop s 27 28 mov ah, 4ch 29 int 21h 30 code ends 31 end start
- 调试到程序退出前,使用d命令查看数据段data对应的内存空间的截图:
对比可见程序将每行第一个单词从大写->小写。
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 dx, 0 22 mov bx, 0 23 24 mov cx, 5 25 s:mov ax, word ptr ds:[di] 26 mov word ptr es:[bx], ax 27 mov ax, word ptr ds:[di].2 28 mov word ptr es:[bx].2, ax 29 30 mov ax, word ptr ds:[si].20 31 mov word ptr es:[bx].7, ax 32 33 mov ax, word ptr ds:[si].30 34 mov word ptr es:[bx].10, ax 35 36 mov ax, ds:[si].20 37 mov dl, ds:[si].30 38 div dl 39 mov byte ptr es:[bx].14, al 40 add di, 4 41 add si, 2 42 add bx, 16 43 loop s 44 45 mov ah, 4ch 46 int 21h 47 code ends 48 end start
-
table段原始数据信息截图
- 运行到程序退出之前,使用d命令查看table段对应的内存空间的截图
信息确实结构化地写入了指定内存