ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-11-22 13:33:02  阅读:169  来源: 互联网

标签:汇编 code mov 源程序 si ax data ds 调试


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,循环实现的功能是什么,逐行理解每条指 令的功能。

        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] //跳到后面的数据段
        mov es:[di+1], al //将数据保存
        inc si //si=si+1
        add di, 2 //di=di+2
        loop s //循环

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

 

 

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

 

 

 

 

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

 由此可以猜测,数值的作用为控制前字符的颜色。

2. 实验任务2

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

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

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

 

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

 

 

 

 data段数据为 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09

cs=076c,ss=076B,ds=076A;

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

4. 实验任务4

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

 

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

 

 

data数据:23 01 56 04;

程序返回前,cs=076c、ss=076b、ds=076a;

code段的段地址为X,则data段的段地址为:X-2,stack段的段地址为:X-1;

对于如下定义的段,name segment ... name ends

则程序加载后,该段实际占有的空间为(1+N/16)个字节;

 

5. 实验任务5

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

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

 

 data数据:23 01 56 04

程序返回前,cs=076A、ss=076E、ds=076D;

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

 

6. 实验任务6

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

(3)可以执行,因为它的代码段定义在数据段和栈段之前,按顺序执行时,可以正确执行代码段。

 

7. 实验任务7

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

 

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,c1
       mov es,ax

       mov si,0
       mov cx,8
       mov ax,0

s1:   mov ax,ds:[si]
       add ax,ds:[si+10h]
       mov es:[si],ax
      
       inc si
       mov ax,0
       loop s1

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

 

 

可见相加正确。

8. 实验任务8

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

 

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 si,0
    mov cx,8

s: push ds:[si] add si,2 loop s mov ax,4ch int 21h code ends end start

 

 

标签:汇编,code,mov,源程序,si,ax,data,ds,调试
来源: https://www.cnblogs.com/dzc2000919/p/14017811.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有