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

1. 实验任务1

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

 

 

 字节数据用途:控制颜色

 

2. 实验任务2

编写程序,在屏幕上以十进制整数形式打印输出这5个两位数
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 si,0
        mov cx,5

      s:mov ax,0
        mov al,ds:[si]
        mov bl,10
        div bl
        add al,48  ;将数字转化为字符
        add ah,48
        mov bh,ah

        mov ah,2
        mov dl,al  ;输出字符
        int 21h
        mov dl,bh
        int 21h

        inc si
        loop s

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

 

 

 

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

 

 

 程序返回前,data段中的数据:

 

程序返回前,CS=076C,SS=0769,DS=075A

 

 

 

程序加载后,设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

程序返回前,data段中数据如下:

 

 

 程序返回前,CS=076C,SS=0769,DS=075A

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

 对于如下定义的段:

name segment

···

name ends

如果段中数据占N个字节,则程序加载后,该段实际占有的空间为(N/16)*16

 

5. 实验任务5

程序返回前,data段中数据如下:

程序返回前,CS=076A,SS=0769,DS=075A

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

 

 

 

6.实验任务6

如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”,则(3)仍可以正确执行,(3)中一开始定义的就是代码段,

程序会从代码开始执行,而(1)(2)中一开始是数据段代码段,逻辑上是错误的执行。

 

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

s:       mov ax,ds:[bx]
         add ax,ds:[bx+16]
         mov ds:[bx+32],ax
         inc bx
         loop s
         mov ah,4ch
         int 21h
code ends
end start

 

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 ax,b
       mov ss,ax
       mov sp,16
       mov bx,0
       mov cx,8
     s:push ds:[bx]
       add bx,2
       loop s

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

 

 

 

实验结论:

使用u指令反汇编时要从CX中减去数据段和栈段的空间;

不同段的空间分开计算,不足16按16计算

 

posted @ 2020-11-26 21:28  突进的小母猪  阅读(94)  评论(2)    收藏  举报