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

实验任务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:实现5次循环,将数据段的nuist全部转化为大写,并将它们一次存入对应的辅助段中字的高位。

 

对task1.asm进行汇编、链接:

运行task1.exe:

使用debug工具对task1.exe进行调试:

  使用r命令得到CX的值:

  使用u命令进行反汇编:

  使用g命令执行到程序返回前:

 

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

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

使用debug工具对task1.exe进行调试:

  使用r命令:

  使用u命令进行反汇编:

  使用g命令执行到程序返回前:

 

源代码中data段line4的字节数据的用途是决定了现实的低位字节的颜色。

 

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

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

对task2.asm进行汇编、链接:

运行task2.exe:

 

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

对task3.asm进行汇编、链接:

 

1、CPU执行程序,程序返回前,data段中的数据为多少?

      23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09

 

2、CPU执行程序,程序返回前,cs=076C 、ss=076B 、ds=076A  。

 

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

 

实验任务4

task4.asm:

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

对task4.asm进行汇编、链接:

 

1、CPU执行程序,程序返回前,data段中的数据为多少?

      23 01 56 04

 

2、CPU执行程序,程序返回前,cs=076C 、ss=076B 、ds=076A 。

 

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

4、对于如下定义的段:

name segment
……
name ends

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

 

 

实验任务5

task5.asm:

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

对task5.asm进行编译、链接:

 

1、CPU执行程序,程序返回前,data段中的数据为多少?

      23 01 56 04

 

2、CPU执行程序,程序返回前,cs=076A 、ss=076E 、ds=076D

 

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

 

 

实验任务6

我认为实验任务5/(3)的程序仍然可以正确执行,因为只有它是在内存中可执行代码在最前面。

 

 

实验任务7

task7.asm:

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

s:    mov ah,0
      mov al,[bx]
      add ax,[bx+16]
      mov es:[si],ax

      add si,1
      add bx,1
      loop s
      
      mov ax,4c00h
      int 21h

code ends
end start

对task7.asm进行汇编、链接:

使用r命令:

使用u命令进行反汇编:

使用g命令执行到程序返回前:

使用d命令查看逻辑段c1:

 

 

实验任务8

task8.asm:

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

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

       mov ax,4c00h
       int 21h

code ends

end start

对task8.asm进行汇编、链接:

使用r命令:

使用u命令进行反汇编:

使用g命令执行到程序返回前:

使用d命令查看逻辑段的数据:

posted @ 2020-11-26 23:59  腓腓  阅读(99)  评论(1)    收藏  举报