• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

孤独的饺子、

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

实验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

使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe。

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

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

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

分析:数值的作用是控制字符的颜色。

2.实验任务2

代码如下:

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

s:    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 s

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

使用masm、link对task2.asm进行汇编、链接,得到可执行文件task2.exe。

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

使用masm、link对task3.asm进行汇编、链接,得到可执行文件task3.exe。

反汇编查看data段中数据及反汇编调试的截图

回答问题:

Question①:返回程序前data中数据:0123H 0456H 0789H 0ABCH 0DEFH 0FEDH 0CBAH 0987H

Question②:CS=076CH,SS=076BH,DS=076AH

Question③:设程code段的段地址为X,那么data段的段地址为X-2,stack段的段地址为X-1

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

 使用masm、link对task4.asm进行汇编、链接,得到可执行文件task4.exe。

Debug反汇编截图

 回答问题:

Question①:data段中的数据为:0123H 0456H 

Question②:CS=076CH,SS=076BH,DS=076AH

Question③:设code段的段地址为X,那么data段的段地址为X-2,stack段的段地址为X-1

Question④:设段中的数据占N个字节,那么程序加载后,这段实际占有的空间为([N/16]+1)*16个字节,中括号代表向下取整

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

使用masm、link对task5.asm进行汇编、链接,得到可执行文件task5.exe。

 使用Debug调试截图

 回答问题:

Question①:data段中的数据为:0123H 0456H 

Question②:CS=076AH,SS=076EH,DS=076DH

Question③:设code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4

6.实验任务6

回答问题:
  只有第三个可以正常执行。
分析:
  如果不指明程序的入口,程序将会从第一条指令顺序向后执行,前两个程序会将data段和stack段中的数据当作指令来执行,而第三个的data段和stack段位于指令代码段的后面,不会影响程序的正常运行。

7.实验任务7

代码如下:

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

使用masm、link对task7.asm进行汇编、链接,得到可执行文件task7.exe。

 使用Debug调试截图

 

8.实验任务8

代码如下:

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 di,0
    mov ax,b
    mov ss,ax
    mov sp,10h
    mov cx,8

s:  push [di]
    add di,2
    loop s

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

使用masm、link对task8.asm进行汇编、链接,得到可执行文件task8.exe。

 使用Debug调试截图

 

 

posted on 2020-11-26 17:44  孤独的饺子、  阅读(80)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3