实验2 多个逻辑段的汇编源程序编写与调试
一、实验目的
1. 理解和掌握8086多个逻辑段的汇编源程序
2. 理解和熟练应用灵活的寻址方式
3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用
4. 掌握使用debug调试8086汇编程序的方法
二、实验准备
复习教材5-8章: 包含多个逻辑段的汇编源程序结构 寻址方式 汇编指令loop, div用法
三,实验内容
1
(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = _076B___, 寄存器(CS) = __076C__
(2假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。
2.
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = _076B___, 寄存器(CS) = __076C__
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。
3.
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076A__,寄存器(SS) = __076C__,寄存器(CS) = __076E__。
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-4__,stack的段地址是 __X-2__。
4.
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = __076C__,寄存器(SS) = __076E__,寄存器(CS) = __076A__。
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__,stack的段地址是__X+4__。
5.
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __2*[N/16] B_([]为向上取整)__。
程序task1_4仍然可以正确执行。不用start指明程序入口时,程序会默认从代码的第一行进行读取。
二
三,
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 cx, 0ah mov ax, data1 mov ds, ax mov bx, 0 s: mov dl, [bx] add dl, [16+bx] mov [32+bx], dl inc bx loop s mov ah, 4ch int 21h code ends end start
反汇编:
相加前:
相加后:
四,
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 bx, 0 mov ax, data1 mov ds, ax mov cx, 8 s1: push [bx] add bx, 2 loop s1 mov bx, 0 mov cx, 8 s2: pop [bx+16] add bx, 2 loop s2 mov ah, 4ch int 21h code ends end start
反汇编:
加载前:
五,
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
g命令一次性执行到程序返回前
源代码中line19的作用是: 将小写字母转换成大写字母
源代码中db 2,3,4,5,6 --> 改成: db 5 dup(2)
源代码中data段line4的字节数据的用途是:line4的作用是设置颜色
六
assume cs:code, ds:data, ss:stack data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends stack segment dw 1 dup(?) stack ends code segment start: mov ax,stack mov ss,ax mov sp,1 mov ax,data mov ds,ax mov ax,data mov es,ax mov cx,4 s: push cx mov bx,0 mov cx,4 s2: mov al,es:[bx] or al,20h mov es:[bx],al inc bx loop s2 pop cx mov ax,es inc ax mov es,ax loop s mov ah, 4ch int 21h code ends end start
加载:
反汇编:
结果:
七,
assume cs:code, ds:data, es:table,ss:stack data segment db '1975', '1976', '1977', '1978', '1979' dd 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends stack segment dw 1 dup(?) stack ends code segment start: mov ax,stack mov ss,ax mov sp,1 mov ax,data mov ds,ax mov ax,table mov es,ax mov di,0;data ;1 mov bx,0;table mov si,0;table mov cx,5 year: push cx mov cx,4 year2: mov al,ds:[di] mov es:[bx+si],al inc si inc di loop year2 pop cx add bx,10h mov si,0 loop year ;2 mov bx,0 mov si,5 mov cx,5 income: push cx mov cx,4 income2: mov al,ds:[di] mov es:[bx+si],al inc si inc di loop income2 pop cx add bx,10h mov si,5 loop income ;3 mov bx,0 mov si,10 mov cx,5 num: push cx mov cx,2 num2: mov al,ds:[di] mov es:[bx+si],al inc si inc di loop num2 pop cx add bx,10h mov si,10 loop num ;4 mov bx,0 mov si,5 mov cx,5 cal: mov ax,word ptr es:[bx+si] add si,2 mov dx,word ptr es:[bx+si] add si,3 div word ptr es:[bx+si] add si,3 mov word ptr es:[bx+si],ax add bx,10h mov si,5 loop cal mov ah, 4ch int 21h code ends end start
调试截图:
在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存