实验3 多个段的汇编源程序编写与调试
一、实验结论
实验过程中使用到的盘符注明为v。
实验一:
实验任务(1):首先按照要求,使用txt记事本文本编辑器,录入汇编源程序task1.asm。实验代码在压缩包中给出了。
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) 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
进入虚拟dos机器,目录设置为masm文件夹,对于task1.asm进行汇编连接。
执行编译好的程序,看到了结果是nuist绿的大写字母显示。
开始debug
在实验中,指定的数据段是data,为唯一的数据段,占用了字节,CX的大小是003B,因此可知具体的反汇编应该到002B处。
程序执行到末尾的时候处于内存空间的002B处,因此,调试到002B处。执行到line27处。
改变了内容进行修改重新编译连接运行,结果是出现了彩色的各种颜色的nuist
db 5 dup(2) --> 改成: db 2,3,4,5,6
后面的四个字母的颜色改变了,因此,此处数值控制的是显示的字母对应的颜色,推理可知,2对应绿色,顺应其他四种颜色对应。对应的应该是ASCII表中的标准色号。
实验任务(2):已知数据段data中定义字节数据如下: 编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。23,50,66,71,35
编写程序如下:
assume cs:code,ds:data
data segment
db 23, 50, 66, 71, 35
data ends
code segment
start:
mov cx,5
mov bx,data
mov ds,bx
s: mov al,ds:[di]
mov bl,10
mov ah,0
div bl
mov dx,ax
add dx,3030H
mov ah,2
int 21h
mov ah,2
mov dl,dh
int 21h
inc di
loop s
mov ah,4CH
int 21h
code ends
end start
执行结果包含了几个数的内容,以十进制形式打印了出来。
实验任务(3):使用任意文本编辑器,录入汇编源程序task3.asm。
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
编译连接
开始进行debug调试
执行到程序结束之前,即1D处
使用-d命令查看内存中的内容
问题1:执行前,data内数据正常的内容是 0123H,0456H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
问题2:CPU执行任务返回前,CS、SS、DS内容分别是076CH,076BH,076AH
问题3:程序开始执行之前,设CODE地址为X,那么DATA段地址为X-2,STACK栈段地址为X-1.data定义了一个十六字节的地址内容,STACK栈定义了十六字节的空间,因此相差10H字节
实验任务(4):使用任意文本编辑器,录入汇编源程序task4.asm。
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
编译连接
开始debug
反汇编,执行到结束之前
问题1:任务执行完成前,data中数据未变,内容是0123H,0456H
问题2:CPU执行返回前,CS、SS、DS的内容分别是076CH、076BH、076AH
问题3:程序加载后CODE段地址为X,则DATA段地址为X-1,STACK栈段地址为X-2
问题4:如果数据段占用了十六字节,那么实际占有的空间16*[N/16+1],取整后运算
实验任务(5):使用任意文本编辑器,录入汇编源程序task5.asm。
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
编译连接
开始debug
反汇编执行到程序结束之前
问题1:程序执行返回之前,data中的值仍然是之前的内容,即0123H,0456H
问题2:CPU执行程序返回前,CS、SS、DS的值分别是076AH、076EH、076DH
问题3:程序加载后CODE的段地址是X,则DATA的段地址是X+3,STACK栈的段地址是X+4
实验任务(6):第三个程序可以正确运行,因为不指定入口的情况下,仍然会找到加载进入内存的第一个单元,cs的初始值为ds+10,第三个程序的代码段放在最开始的时候,因此尽管有错误,还是能正常执行到程序自己退出
实验任务(7):使用任意文本编辑器,录入汇编源程序task7.asm。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c1 segment
db 8 dup(0)
c1 ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,c1
mov ss,ax
mov sp,8
mov cx,4
mov bx,6
s: mov al,ds:[bx]
add al, es:[bx]
mov ah,ds:[bx+1]
add ah,es:[bx+1]
push ax
sub bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
编译连接
实验任务(8):使用任意文本编辑器,录入汇编源程序task8.asm。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,b
mov ss,ax
mov sp,16
mov ax,a
mov ds,ax
mov bx,0
s: push ds:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
编译连接
反汇编
执行到对应位置
二、实验总结
1、初步了解了字体颜色在屏幕上显示的汇编写法
2、尝试编写了十进制输出数字的程序