实验二 多个逻辑段的汇编源程序编写和调试
一、实验目的
1. 理解和掌握8086多个逻辑段的汇编源程序
2. 理解和熟练应用灵活的寻址方式
3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用
4. 掌握使用debug调试8086汇编程序的方法
二、实验准备
复习教材5-8章:
包含多个逻辑段的汇编源程序结构
寻址方式
汇编指令loop, div用法
三、实验内容
1. 实验任务11-1:在debug中执行到line17结束、line19之前
DS=076A,SS=076B,CS=076C
code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。
1-2:在debug中执行到line17结束、line19之前
DS=076A,SS=076B,CS=076C
code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。
1-3:在debug中执行到line17结束、line19之前
DS=076A,SS=076C,CS=076E
code段的段地址是X,则,data段的段地址是X-4, stack的段地址是X-2。
1-4:在debug中执行到line17结束、line19之前
DS=076C,SS=076E,CS=076A
code段的段地址是X,则,data段的段地址是X+2, stack的段地址是X+4。
1-5:
对于如下定义的段,程序加载后,实际分配给该段的大小是 N字节
将所有伪指令end start改成end:只有 task1_4可以正确执行可以正确执行
因为end start改为end后,前三个以数据段开头,cs指向出现错误,而第四个开头即为程序段,所以仍然能执行.
实验任务2
代码:
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:
代码:
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 ax, data2 ; mov ax, data3 mov ds,ax mov bx,0 mov cx,10h 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:
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等数据,程序存储调用方式的不同。