实验2 多个逻辑段的汇编源程序编写与调试
一、实验目的
1. 理解和掌握8086多个逻辑段的汇编源程序
2. 理解和熟练应用灵活的寻址方式
3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用
4. 掌握使用debug调试8086汇编程序的方法
二、实验准备
复习教材5-8章:
包含多个逻辑段的汇编源程序结构
寻址方式
汇编指令loop, div用法
三、实验内容
1. 实验任务1
任务1-1
task1_1.asm
在debug中执行到line17结束、line19之前
在此时DS=076A,SS=076B,CS=076C
程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。
任务1-2
task1_2.asm
在debug中执行到line17结束、line19之前
在此时DS=076A,SS=076B,CS=076C
程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。
任务1-3
task1-3.asm
在debug中执行到line17结束、line19之前
在此时DS=076A,SS=076C,CS=076E
程序加载后,code段的段地址是X,则,data段的段地址是X-4, stack的段地址是X-2。
任务1-4
task1-4.asm
在debug中执行到line17结束、line19之前
在此时DS=076C,SS=076E,CS=076A
程序加载后,code段的段地址是X,则,data段的段地址是X+2, stack的段地址是X+4。
任务1-5
对于如下定义的段,程序加载后,实际分配给该段的大小是 N字节
将所有伪指令end start改成end
task1_1不能正确执行
task1_2不能正确执行

task1_3不能正确执行

task1_4可以正确执行

因为end start改为end后,前三个以数据段开头,cs指向出现错误,而第四个开头即为程序段,所以仍然能执行.
实验代码task2.asm
assume cs:code code segment start: mov ax,0b800h mov ds,ax mov bx,0f00h mov ax,0403h mov cx,80 s: mov ds:[bx],ax add bx,2 loop s mov ah, 4ch int 21h code ends end start

实验任务3
补充后的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 ax, data1 mov ds,ax mov bx,0 mov cx,10 s: mov ax,ds:[bx] add ax,ds:[bx+10h] mov ds:[bx+20h],ax inc bx loop s mov ah, 4ch int 21h code ends end start
代码运行结果
反汇编结果:

运行前的内存情况

将代码成功运行之后的内存情况如下图

实验任务4
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 ax, data1 mov ds, ax mov ax, data2 mov es, ax mov ss, ax mov sp, 32 mov bx, 0 mov cx, 8 s1: push [bx] add bx, 2 loop s1 mov bx,16 mov cx, 8 s2: pop [bx] add bx, 2 loop s2 mov ah, 4ch int 21h code ends end start
反汇编结果:

运行之前的内存

代码运行后的内存

实验任务5
源程序代码:
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
程序运行结果:

25行之后27行之前

源程序的功能是打印大写彩色的NUIST
改变第4行:

这里的数值是用来设置显示字符的颜色。
实验任务6
程序源代码:
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax, data mov ds, ax mov cx, 64 mov bx, 0 s: or [bx], byte ptr 20h inc bx loop s mov ah, 4ch int 21h code ends end start
程序执行后:

实验任务7
源程序代码:
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends code segment start: mov ax, data mov ds, ax mov ax, table mov es, ax mov cx, 5 mov bx, 0 mov si, 0 s1: mov ax, [si] mov es:[bx], ax mov ax, [si+2] mov es:[bx+2], ax add bx, 16 add si, 4 loop s1 mov cx, 5 mov bx, 5 mov si, 20 s2: mov ax, [si] mov es:[bx], ax mov ax, 0000h mov es:[bx+2], ax add bx, 16 add si, 2 loop s2 mov cx, 5 mov bx, 10 mov si, 30 s3: mov ax, [si] mov es:[bx], ax add bx, 16 add si, 2 loop s3 mov cx, 5 mov si, 5 s4: mov ax, es:[si] mov bl, es:[si+5] div bl mov es:[si+8], al add si, 16 loop s4 mov ah, 4ch int 21h code ends end start
执行结束:

四、实验总结
通过这次的实验我更加理解了数据存储在内存中的形式,理解了db,dw的不同。也知道了cs ds等数据,程序存储调用方式的不同.同时我复习了并且巩固了div的用法,在32位除以16位以及16位除以8位时div的区别。而且通过将end start的start去除的实验,我知道了start的作用,以及去掉后可能造成的影响.
浙公网安备 33010602011771号