首页 > 其他 > 详细

实验3 多个段的汇编源程序编写与调试

时间:2020-11-21 23:49:28      阅读:32      评论:0      收藏:0      [点我收藏+]

实验3 多个段的汇编源程序编写与调试


 

1.实验任务1

使用任意文本编辑器,录入汇编源程序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

阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。

源代码的功能是:将数据段前五个字节单元中的“Nuist”转换为大写和数据段后五个字节单元中的数据一起保存至附加段中在屏幕上显示。

        mov cx, 5    ;设置循环次数为5
        mov si, 0    ;将0送到si
        mov di, 0f00h    ;设置起始内存单元地址
s:      mov al, [si]    ;将数据段前五个字节的内存单元[si]送入al
        and al, 0dfh    ;转换字母为大写
        mov es:[di], al    ;将结果保存至附加段
        mov al, [5+si]    ;指针指向后五个字节的内存单元[5+si]
        mov es:[di+1], al    ;将数据段后五个字节中相应的数据保存至大写字母后面
        inc si    ;si加1
        add di, 2    ;di加2
        loop s    ;循环

①使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

技术分享图片

②使用debug工具对程序进行调试,执行到程序返回前,及line27之前,观察结果。

技术分享图片

③修改line4里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

运行结果:

技术分享图片

④基于观察,分析、猜测这里的数值作用是什么。

答:猜测这里的数值的作用是改变显示字符的颜色。

2.实验任务2

已知数据段data中定义字节数据如下:

data segments
    db 23,50,66,71,35
data ends

编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。

①源代码task2.asm

assume cs:code,ds:data
data segment
    db 23,50,66,71,35
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov di,0
    mov cx,5

s1:    mov ah,0
    mov al,ds:[di]
    mov bl,10
    div bl
    mov ds:[10+di],al
    mov ds:[11+di],ah

    mov ah,2
    mov dl,ds:[10+di]
    add dl,30h
    int 21h

    mov ah,2
    mov dl,ds:[11+di]
    add dl,30h
    int 21h

    mov ah,2
    mov dl," "
    int 21h
    
    inc di
    loop s1

    mov ax,4c00h
    int 21h
code ends
end start

②运行结果截图

技术分享图片

3.实验任务3

教材「实验5 编写、调试具有多个段的程序」(1)

源程序码见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查看data中的数据:

技术分享图片

反汇编后运行至程序返回前查看data中的数据:

技术分享图片 

程序返回前各个寄存器的数据:

技术分享图片

回答问题:

①CPU执行程序,程序返回前,data段中的数据为多少?

  答:0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CABH,0987H

②CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

4.实验任务4

教材「实验5 编写、调试具有多个段的程序」(2)

源程序码见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查看data中的数据:

技术分享图片

反汇编后运行至程序返回前查看data中的数据:

技术分享图片

程序返回前各个寄存器的数据:

技术分享图片

回答问题:

①CPU执行程序,程序返回前,data段中的数据为多少?

  答:0123H,0456H

②CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

5.实验任务5

教材「实验5 编写、调试具有多个段的程序」(3)

源程序码见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,反汇编后运行至push ds:[0]前查看data中的数据:

技术分享图片

运行至程序返回前查看data中的数据:

技术分享图片

程序返回前各个寄存器的数据:

技术分享图片

回答问题:

①CPU执行程序,程序返回前,data段中的数据为多少?

  答:0123H,0456H

②CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH

③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4

6.实验任务6

教材「实验5 编写、调试具有多个段的程序」(4)

如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以运行?请说明原因。

  答:第(3)题的程序task5.exe仍然可以正确执行,因为如果不指明入口位置,则程序从所分配的空间开始执行,前2题开头是数据段,会被当成指令读入,只有从第(3)题一开始是指令代码。

7.实验任务7

教材「实验5 编写、调试具有多个段的程序」(5)

源程序码见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

c segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c ends

code segment
start:
    mov ax,a
    mov ds,ax
    mov ax,b
    mov es,ax
    mov ax,c
    mov ss,ax
    mov bx,0
    mov cx,8
s:    mov ax,[bx]
    mov ss:[bx],ax
    mov ax,es:[bx]
    add ss:[bx],ax
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end start

汇编、链接进入debug:

技术分享图片

反汇编:

技术分享图片

运行至程序返回前,查看逻辑段c的数据:

技术分享图片

所编写程序正确实现了题目要求。

8.实验任务8

教材「实验5 编写、调试具有多个段的程序」(6)

源程序码见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,a
    mov ds,ax
    mov ax,b
    mov bx,0
    mov ss,ax
    mov sp,16
    mov cx,8
s:     push [bx]
    add bx,2
    loop s
    mov ax,4c00h
    int 21h
code ends
end start

汇编、链接进入debug:

技术分享图片

反汇编后运行至程序返回前:

 技术分享图片

查看逻辑段b的数据:

技术分享图片

所编写程序正确实现了题目要求。

实验3 多个段的汇编源程序编写与调试

原文:https://www.cnblogs.com/chixuan220/p/14017791.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!