实验任务一
任务1-1:
对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
回答问题:
1.在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076A__, 寄存器(SS) = __076B__, 寄存器(CS) = __076C__
2.假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。
任务1-2:
对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
回答问题:
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076A__, 寄存器(SS) = __076B__, 寄存器(CS) = __076C__
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。
任务1-3:
对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
回答问题:
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076A__, 寄存器(SS) = __076C__, 寄存器(CS) = __076E__
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-4__, stack的段地址是__X-2__。
任务1-4:
对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
回答问题:
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076C__, 寄存器(SS) = __076E__, 寄存器(CS) = __076A__
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__, stack的段地址是__X+4__。
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _(N/16)的上取整___。
② 伪指令 end start 改成 end后得:
task1_1截图:
task1_2截图:
task1_3截图:
task1_4截图:
由截图可知,只有task1_4.asm程序仍然可以正确执行。这是因为任务1_1到任务1_3都是先定义数据段再定义代码段,而任务1_4是先定义代码段再定义数据段的。end start告诉程序,代码是从start开始,写成end后程序就从第一行开始编译。因为任务1_4代码段写在前面,从第一行编译不受影响。
实验任务二
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数据03 04。
实验代码
assume cs:code code segment mov ax, 0b800h mov ds, ax mov bx, 0f00h mov cx, 160 s: mov ax, 0403h mov [bx], ax add bx, 2h loop s mov ax,4c00h int 21h code ends end
实验结果截图:
实验任务三
已知8086汇编源程序task3.asm代码片段如下。
task3.asm
assume cs:code data1 segment db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers data1 ends data2 segment db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers data2 ends data3 segment db 16 dup(0) data3 ends code segment start: ; ××× mov ah, 4ch int 21h code ends end start
要求:
① 编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。
② 在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1, data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。
代码:
assume cs:code data1 segment db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers data1 ends data2 segment db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers data2 ends data3 segment db 16 dup(0) data3 ends code segment start: mov bx,0 mov cx,10 mov dx,0 s:mov dx,0 mov ax,data1 mov ds,ax add dl,[bx] mov ax,data2 mov ds,ax add dl,[bx] mov ax,data3 mov ds,ax mov [bx],dl inc bx loop s mov ax,4c00h int 21h code ends end start end start
查看结果:
由运行结果可知,实验要求已完成。
实验任务四
已知8086汇编源程序task4.asm代码片段如下。
task4.asm
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(?) data2 ends code segment start: ; ××× mov ah, 4ch int 21h code ends end start
要求:
① 补全程序,实现把逻辑段data1中的8个字数据逆序存储到逻辑段b中。
② 汇编、连接后,在debug中加载程序,运行到line15程序退出前,使用d命令查看数据段data2对应的 内存空间,确认是否实现题目要求。
补全后的代码:
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(?) data2 ends code segment start: mov ax,data2 mov ss,ax mov sp,10h mov ax,data1 mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov ah, 4ch int 21h code ends end start
结果截图:
由图可知已实现要求
实验任务五
使用任意文本编辑器,录入汇编源程序task5.asm。
task5.asm
assume cs:code, ds:data data segment db 'Nuist' db 2, 3, 4, 5, 6 data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指 令的功能。
对程序进行汇编、链接,得到可执行文件,运行并观察结果。
使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察 结果。
源代码中line19的作用是?
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 2,3,4,5,6 --> 改成: db 5 dup(2) 或 db 5 dup(5)
基于观察,分析、猜测这里的数值作用是什么。
对程序进行汇编、链接,得到可执行文件,运行结果如下
使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察结果如下
源代码中line19的作用是实现将小写字母变成大写字母的操作
将line4的改为db 5 dup(2),结果截图如下:
由图可知,这条语句的命令是改变字体的颜色。
实验任务六
已知8086汇编源程序task6.asm代码片段如下。
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 ; ××× 13 mov ah, 4ch 14 int 21h 15 code ends 16 end start
要求:
① 补全程序,将data段中的每行第一个单词从大写->小写。
② 在debug中加载程序,反汇编,执行到line13退出前,用d命令查看data段对应的内存空间,确认每 行第一个单词已经由大写->小写。
补全后代码如下:
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 mov cx, 4 16 17 s0:mov dx,cx 18 mov cx,4 19 mov si,0 20 21 s: or byte ptr [bx+si], 00100000b 22 inc si 23 loop s 24 add bx,10h 25 mov cx,dx 26 loop s0 27 28 mov ah, 4ch 29 int 21h 30 code ends 31 end start
运行结果如下
由截图可知效果已得到。
实验任务7
要求:
① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。 表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用 空格间隔。
② 汇编、连接后,在debug中加载、调试程序。灵活、合理使用u命令、g命令、d命令,显示刚开始逻 辑段table的数据信息,以及,结构化存入数据后,数据段table的数据信息,确认实现题目要求。
实验代码如下
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 16 mov ax, data 17 mov ds, ax 18 mov ax, table 19 mov es, ax 20 21 mov bx, 0 ;年份 22 mov si, 0 23 mov cx, 5 24 s0:mov ax, [si] 25 mov es:[bx], ax 26 mov ax, [si+2] 27 mov es:[bx+2], ax 28 add si, 4 29 add bx, 10h 30 loop s0 31 32 mov bx, 0 ;收入 33 mov si, 14h 34 mov cx, 5 35 s1:mov ax, [si] 36 mov es:[bx+5], ax 37 mov ax, 0 38 mov es:[bx+5+2], ax 39 add si, 2 40 add bx, 10h 41 loop s1 42 43 mov bx, 0 ;雇员数 44 mov si, 1eh 45 mov cx, 5 46 s2:mov ax,[si] 47 mov es:[bx+0ah], ax 48 add si, 2 49 add bx, 10h 50 loop s2 51 52 mov bx, 0 ;求商 53 mov cx, 5 54 s3:mov ax, es:[bx+5] 55 mov dx, es:[bx+5+2] 56 div word ptr es:[bx+0ah] 57 mov es:[bx+0dh], ax 58 add bx, 10h 59 loop s3 60 61 mov ah, 4ch 62 int 21h 63 code ends 64 end start
实验结果截图: