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

一、实验目的


  1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
  2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
  3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
  4. 理解并掌握各种寻址方式的灵活应用
  5. 掌握汇编指令loop, and, or,div, mul的用法

二、实验准备


复习教材chapter 6-8章。

三、实验内容


1、实验任务1

使用任意文本编辑器,录入汇编源程序task1.asm。

 

 使用masm、link汇编、链接源程序,运行task1.exe

 

 debug task1.exe得出结果:

 

 修改源代码,重新汇编、链接、执行,得到结果:

 

 问题分析:
通过两次执行的截图,我们可以看出字符串的颜色发生了改变,由此我们可以推出这里的数值作用是控制字符串的颜色。

2、实验任务2

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

实验代码:

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

实验代码:

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段数据:23 01 56 04
cs:076c ss:076b ds:076a

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

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

debug调试:

 

 由图可得:

data:23 01 56 04
cs:076a ss:076e ds:076d
设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。

6、实验任务6

问题:如果将实验任务3、4、5中的最后一条伪指令"end start"改为"end",则哪个程序仍可以正确运行?请说明原因。

实验任务3和4不能正确执行,只有实验任务6可以正确执行。

这是因为当没有指明程序入口时,end指令从当前的cs:ip值开始进入程序。而在实验任务6中程序以代码段开始,不会将其他数据段当成代码段执行,用r命令查看IP=0,所以能正确执行。

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

c segment
  db 8 dup(0)
c ends

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

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

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

debug调试:

确实成功放入了。

四、实验总结


  1. 对数据、代码、栈放入不同的段有了更深的理解。
  2. 学会了编写、调试有多个段的程序。

 

posted @ 2020-11-21 17:03  jiangduwang  阅读(144)  评论(2)    收藏  举报