实验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、尝试编写了十进制输出数字的程序

 

posted @ 2020-11-26 12:07  无口赤红  阅读(160)  评论(2编辑  收藏  举报