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

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

一、实验目的

  1、理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试

  2、理解具有多个段的汇编源程序对应的目标程序执行时,内存的分配方式

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

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

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

二、实验准备

  复习教材chapter6-8章

三、实验结论

  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

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

  

  使用debug工具进行调试,执行到程序返回前,即line27之前结果如下:

  

  

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

db 5 dup(2) 
--> 改成:
db 2,3,4,5,6

  

   猜测:这里的数值的作用主要是向显存中写入颜色数据

  2、实验任务2

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

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

  编写程序,在屏幕上以十进制整数形式打印输出这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 cx,5
    mov si,0
 
 s: mov ah,0
    mov al,[si]
    mov bl,10
    div bl
    mov bx,ax
 
    mov ah,2
    or bl,30h
    mov dl,bl
    int 21h
     
    mov ah,2
    or bh,30h
    mov dl,bh
    int 21h

    mov ah,2
    mov dl,','
    int 21h

    inc si
    loop s

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

  运行结果如下

  

  3、实验任务3

  task3.asm源代码如下:

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=076B ds=076A

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

  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=076B、ds=076A

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

   该段实际占有的空间为([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

  运行结果如下:

  

   

  此时查看数据

  

   data数据段中的数据如上图所示

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

  code段的段地址是X,则data段的段地址为X+3,stack段的段地址是X+4

  6、实验任务6

  只有task5.exe可以正确执行,应为在task5.asm中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   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c1 ends

code segment
start:
       mov ax,a
       mov es,ax
       mov ax,c1
       mov ds,ax
       mov bx,0
       mov cx,8
  s1:  mov ax,es:[bx]
       add [bx],ax
       add bx,2
       loop s1
       mov ax,b
       mov es,ax
       mov bx,0
       mov cx,8
  s2:  mov ax,es:[bx]
       add [bx],ax
       add bx,2
       loop s2
       mov ax,4c00h
       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,b
       mov ss,ax
       mov sp,10h
       mov ax,a
       mov ds,ax
       mov bx,0
  s:   push[bx]
       add bx,2
       loop s
       mov ax,4c00h
       int 21h
code ends
end start

  运行结果如下:

  

  

  

posted @ 2020-11-25 12:42  Sunnynight  阅读(123)  评论(2编辑  收藏  举报