首页 > 其他 > 详细

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

时间:2020-11-26 00:12:18      阅读:31      评论:0      收藏:0      [点我收藏+]

 

一、实验目的

  1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
  2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式

  3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法

  4. 理解并掌握各种寻址方式的灵活应用

  5. 掌握汇编指令loop, and, or,div, mul的用法

二、实验准备

复习教材chapter 6-8章。

三、实验内容

 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
技术分享图片

通过汇编、连接task1.asm得到task1.obj和task1.exe然后运行task1.exe,发现有输出结果绿色的NUIST:

 

 技术分享图片

 

使用debug工具对程序进行调试,执行到程序返回前,即line23之前,观察的结果如下图所示:

 

 技术分享图片

技术分享图片

 

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:

 

 技术分享图片

在loop中使用mov al, [5+si]读出并且输出,用于设置显示颜色。

2表示绿色,3表示蓝色,4表示红色,5表示紫色,6表示橙色

 

2. 实验任务2 

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

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

编写代码:

技术分享图片
assume cs:code, ds:data
data segment
    db 23,50,66,71,35
data ends
code segment
start:
    mov ax,0810h
    mov es,ax
    mov ax,data
    mov ds,ax
    mov ax,0
    mov si,0
    mov di,0
    mov cx,5
s:    mov al,ds:[di]
    mov bl,10
    div bl
    add al,48
    add ah,48
    mov es:[si],al
    mov es:[si+1],ah
    mov ah,2
    mov dl,es:[si]
    int 21h
    mov ah,2
    mov dl,es:[si+1]
    int 21h
    mov ah,2
    mov dl,32
    int 21h
    add si,2
    inc di
    mov ax,0
    loop s
    mov ah,4ch
    int 21h
code ends
end start
技术分享图片

运行结果如下 可见数字依次输出:

 技术分享图片

 

 

3. 实验任务3

 

 实验3源代码如下:

技术分享图片
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工具对task3.exe进行调试:

技术分享图片

u命令后输入21是因为一共有4100h个空间,只剩下21h

技术分享图片

 

使用g命令调试:

技术分享图片

ds变为076a:

技术分享图片

 

(1)data段中的数据是:23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09,观察到的结果和理论分析一致。

技术分享图片

(2)CPU执行程序,程序返回前,cs=076c  ss=076b  ds=076a 

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

 

4. 实验任务4

实验4源代码如下:

技术分享图片
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
技术分享图片

使用d命令查看数据:

技术分享图片

 

 (1)CPU执行程序,程序返回前,data段中的数据为0123h和0456h:

技术分享图片

 

 (2)CPU执行程序,程序返回前,cs=076c  ss=076b  ds=076a :

技术分享图片

 

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

(4)如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为[1+N/16],([]表示取整)

 

5. 实验任务5

 实验5源代码如下:

技术分享图片
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
技术分享图片

 使用d命令查看数据:

技术分享图片

(1)CPU执行程序,程序返回前,data段中的数据为0123h和0456h:

技术分享图片

 (2)CPU执行程序,程序返回前,cs=076a  ss=076e  ds=076d :

技术分享图片

 (3)设程序加载后,code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4

 

6. 实验任务6

如果将实验任务3,4,5中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个仍然可以正确执行?请说明原因。

实验任务5改后调试:

技术分享图片

 

只有实验任务5的程序还能够正确执行。因为没有指明程序入口时,cs设定为ds+10,即PSP后的位置作为程序入口,而(3)的代码段放在了最前面,刚好对应上

 

7. 实验任务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

c segment   
  db 8 dup(0)
c ends

code segment
start:
    mov ax,a
    mov ds,ax
    
    mov ax,c
    mov es,ax
    
    mov bx,0
    mov cx,8
    
s:    
    mov ax,0
    mov al,ds:[bx]
    add al,ds:[bx+16]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21
    
code ends
end start
技术分享图片

使用debug工具对task7.exe进行调试:

技术分享图片

 

 

技术分享图片

 

 

 

8. 实验任务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,a
    mov ds,ax
    mov ax,b
    mov ss,ax
    mov cx,8
    mov si,0
    mov sp,10h
s: push [si]
    add si,2
    loop s
    mov ax,4c00h
    int 21h
code ends
end start
技术分享图片

执行代码,观察b段,可以看到求解成功

 技术分享图片

 

 

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

原文:https://www.cnblogs.com/ligd/p/14039542.html

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