实验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段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存


浙公网安备 33010602011771号