实验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,循环实现的功能是什么,逐行理解每条指令的功能。
        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]//将第si+5个字节送入al
        mov es:[di+1], al//保存数据
        inc si//si+1
        add di, 2//di+2
        loop s 

使用masm对代码进行汇编

使用link对代码进行链接

 

执行task1.exe,结果如下所示:

 

使用u命令进行精确反汇编

执行到程序返回前,即line27之前,观察结果

 将line4改成db 2,3,4,5,6,重新汇编、链接、运行、观察结果

 基于观察,分析、猜测这里的数值作用是什么?

数值的作用是改变字符的颜色。

 

实验任务2

已知数据段data中定义字节数据如下:
data segments 
   db 23, 50, 66, 71, 35 
data ends

代码如下:

assume cs:code, ds:data
 data segment 
     db 23, 50, 66, 71, 35
     db 10 dup(0)
 data ends
 
code segment
  start:
        mov ax, data
          mov ds, ax
          mov cx,5
          mov si,0
  s1:
          mov ah, 0
          mov al, ds:[si]
          mov bl, 10
          div bl
          mov ds:[si+5],al
          mov ds:[si+6],ah

          mov ah, 2
          mov dl,ds:[si+5]
          add dl, 30h
          int 21h 

          mov ah, 2
          mov dl, ds:[si+6]
          add dl, 30h
          int 21h

          inc si
          mov ah, 2
          mov dl,“ ”

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

对程序进行汇编和链接

 

运行程序,得到十进制数字

 

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

对程序进行汇编和链接

 

使用r命令查看寄存器的值

查看data中的数据

使用u命令进行反汇编

 程序返回前各个寄存器的数据和data数据如下所示:

 

 

1.CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H

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

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

 

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

将代码进行汇编和链接

 

进入debug,使用r命令查看寄存器的值并且查看data中的数据

 

使用u命令进行精确反汇编

 

运行至程序返回前查看data中的数据

 

程序返回前各个寄存器的数据:

 

1.CPU执行程序,程序返回前,data段中的数据为:0123H,0456H

2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH。

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

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

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

对程序进行汇编和链接

 

进入debug,使用r命令查看寄存器信息

  

执行到程序返回前

 

1.CPU执行程序,程序返回前,data段中的数据为:0123h,  0456h

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

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

 

实验任务6

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

如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以运行?请说明原因。

只有task5.exe可以正确执行,因为实验任务5的程序的data段和stack段都定义在程序的code段后,而其他实验的程序data段和stack段定义在程序的code前,将end start 改为end后,其他程序的data段和stack段将被当做程序执行,会出错,task5的程序从code段开始执行,所以不会出错。

 

实验任务7

「实验编写、调试具有多个段的程序」(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 ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
db 8 dup(0)
c1 ends ;
code segment
start:
      mov ax,a
      mov ds,ax
      mov ax,b
      mov ss,ax
      mov ax,c1
      mov es,ax

      mov bx,0
      mov cx,8
s:    mov ax,ds:[bx]
      add ax,ss:[bx]
      mov es:[bx],ax

      add bx,1

      loop s

      mov ax,4c00h
      int 21h

code ends
end start

 对代码进行汇编和链接

 

进入debug,使用r语言查看寄存器的值。

对程序进行反汇编

 查看结果,可以看到实现了题目要求

 

 

实验任务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,a
      mov ds,ax
      mov bx,0
      mov ax,b
      mov ss,ax
      mov sp,16
      mov cx,8
s:   push [bx]
      inc bx
      inc bx
      loop s
      mov ax,4c00h
      int 21h
code ends
end start

将代码进行汇编和链接

对程序进行精确反汇编

 

查看逻辑段b的数据,可以看到实现了题目要求

 

posted @ 2020-11-23 09:44  luv-letter123  阅读(121)  评论(2)    收藏  举报