码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-11-30 15:18:51      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:教材   strong   字节   lin   执行文件   name   打印   deb   loop   

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

实验任务1

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

assume cs:code, ds:data
data segment
        db ‘Nuist‘
        db 5 dup(2)
        ;db 2,3,4,5,6
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,循环实现的功能是什么,逐行理解每条指令的功能。

1、使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

技术图片

观察到屏幕左下角打印出“NUIST”五个绿色字母

2、使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。

先反汇编找到line27所在位置

技术图片

再使用g命令

技术图片

观察到屏幕左下角打印出“NUIST”五个绿色字母

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

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

修改后运行结果:

技术图片

观察到字母的颜色发生了变化

联想之前实验二可知这里的数字表示每个字符的颜色

实验任务2

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

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

编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。

1、编写程序如下:

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

	s:    mov  ax,0
	      mov  al,[si]
	      mov  bl,10
	      div  bl
	      inc  bx
	      add  ax,3030h

	      mov  dx,ax
	      mov  ah,2
	      int  21h
	      mov  dl,dh
	      int  21h

		  inc si
	      loop s

	      mov  ah,4ch
	      int  21h
         

code ENDS
END start

2、运行结果:

技术图片

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

1、CPU执行程序,程序返回前,data段中的数据不变

即data段中数据仍为:0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

程序执行前:

技术图片

程序返回前:

技术图片

观察到data段数据不变

2、程序返回前,CS=076CH, SS=076BH, DS=076AH

技术图片

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

实验任务4

教材「实验5 编写、调试具有多个段的程序」(2)

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

1、CPU执行程序,程序返回前,data中数据不变,即0123h, 0456h。

2、CS=076CH,SS=076BH,DS=076AH

反汇编

技术图片

执行到程序返回前

技术图片

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

4、对于如下定义的段:

name segment
 ...
name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为?N/16?*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

1、CPU执行程序,程序返回前,data中数据不变,即0123h, 0456h。

2、CS=076AH,SS=076EH,DS=076DH

反汇编

技术图片

执行到程序返回前

技术图片

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

实验任务6

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

答:只有第3题的程序(task5)仍可以正确执行。

前两题程序开始定义的数据段,而第3题定义的是代码段。若不指定程序入口,CPU将从第一个单元开始执行,故只有第3题能正确执行。

实验任务7

教材「实验5 编写、调试具有多个段的程序」(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

c segment
	  db 8 dup(0)
c ends

code segment
	start:
	      mov ax,a
	      mov ds,ax

	      mov ax,c
	      mov es,ax

	      mov si,0
	      mov cx,8

	s:    mov al,[si]
        add al,[si+10H]
        mov es:[si],al
         
        inc si
        loop s

        mov ah,4ch
        int 21h

code ends
end start

调试运行结果:

相加前

技术图片

相加后

技术图片

计算结果正确

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

	      mov  ah,4ch
	      int  21h

code ends
end start

调试运行结果:

技术图片

成功逆序存储至b段

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

标签:教材   strong   字节   lin   执行文件   name   打印   deb   loop   

原文地址:https://www.cnblogs.com/estzzz/p/14032267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!