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

四、实验结论

  1. 实验任务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!设置循环次数为5 
        mov si, 0
        mov di, 0f00h !设置起始内存单元地址
s:      mov al, [si] !将数据段内存单元[si]赋给al
        and al, 0dfh !将字母转为大写字母
        mov es:[di], al !将结果保存给附加段的内存单元中
        mov al, [5+si] !将指针移动至保存数据的内存单元中
        mov es:[di+1], al !将数据紧跟大写字母保存
        inc si !si自增1
        add di, 2 !di因为每次保存两字节数据(字母和数字2)所以自增2
        loop s !继续下次循环

        mov ah, 4ch
        int 21h
code ends
end start
  • 运行结果截图

  • 在debug里调试到程序返回前的截图

  • 分析源代码中data段line4的字节数据的用途
    修改line4里5个字节单元的值——db 5 dup(2)改成db 2,3,4,5,6

        db 2,3,4,5,6

结果如下:

猜测此处数据的作用是改变大写字母的颜色。

  1. 实验任务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
  • 运行结果截图
  1. 实验任务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
  • 回答教材中①②③三个问题。
    ①cpu执行程序返回前,data段中的数据为多少:

    ②cpu执行程序返回前,cs=076CH、ss=076BH、ds=076AH

    ③程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
  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

  • 回答教材中①②③④四个问题。
    ①CPU执行程序,程序返回前,data段中的数据为多少

    ②CPU执行程序,程序返回前,cs=076CH、ss=076BH、ds=076AH

    ③data段的段地址为X-2,stack段的段地址为X-1
    ④对于如下定义的段
name segment
...
name ends

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

  1. 实验任务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
  • 回答教材中①②③三个问题。
    ①CPU执行程序,程序返回前,data段中的数据为多少

    ②CPU执行程序,程序返回前,cs=076AH、ss=076EH、ds=076DH

    ③data段的段地址为X+3,stack段的段地址为X+4
  1. 实验任务6
  • 如果将(1)、(2)、(3)题中最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
    答:task5仍可以正确执行。CPU无法自动识别哪些是指令哪些是数据。如果不指明入口位置,则程序会按顺序从所分配的空间开始执行。由于task5是汇编指令段开头,按顺序能够正确执行。
  1. 实验任务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

c segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c ends

code segment
start:
        mov ax,a
        mov ds,ax
        mov cx,8
        mov ax,b
        mov es,ax
        mov di,0
       
s:      mov al,ds:[di]
        add es:[di],al
        inc di
        loop s
 
        mov ax,c
        mov ds,ax
        mov cx,8
        mov di,0
 
s1:     mov al,es:[di]
         add [di],al
         inc di
         loop s1
 
         mov ax,4c00h
         int 21h

code ends
end start
  • 在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求。
  1. 实验任务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,b
	      mov  ss,ax
	      mov  ax,a
	      mov  ds,ax
	      mov  sp,0010h
	      mov  di,0
	      mov  cx,8

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



	      mov  ax,4c00h
	      int  21h
code ends
end start
  • 在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求。
posted @ 2020-11-26 23:44  Ranye123  阅读(89)  评论(2)    收藏  举报