汇编语言 第五章 实验

  • Post author:
  • Post category:其他


(1)编程,向内存0:200~0:23F依次传送数据0~63(3FH)。

(2)编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和”int 21h”。

(3)下面的程序的功能是将”mov ax,4c00h”之前的指令复制到内存0:200处,补全程序,上机调试,跟踪运行结果。

assume cs:code

code segment

mov ax,_______

mov ds,ax

mov ax,0020h

mov es,ax

mov bx,0

mov cx,_______

s:mov al,[bx]

mov es:[bx],al

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

提示:

(1)复制的是什么?从哪里到哪里?

(2)复制的是什么?有多少个字节?你如何知道要复制的字节的数量?

_____________________________________________________________________________________________________

(1)

assume cs:code

code segment

start :mov ax,0020h

mov ds,ax

mov cx,03fh

mov bx,0

s:mov [bx],bl

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end start

(2)同上(更简单的实在想不出来了)

(3)这题没想出来。。。看了答案明白了

这题需要前面的基础很扎实

分析:

①使用debug调试程序时,cx中的初始值便是这个程序代码的大小(按照字节数)。我们可以通过运行debug调试生成的EXE文件,但要先给cx寄存器赋值。侧面验证CX寄存器的另一个作用。

②cs段寄存器中存储的是指向程序代码段的段地址。此实验是将程序的代码(按字节)复制,故将cs寄存器中的指向代码的段地址赋值给ax,再通过ax寄存器赋值给ds段寄存器(在8086CPU中,ds、ss、cs、es四个段寄存器存放的都是段地址,在CPU来看,其他的寄存器一般存放的都是数据。这四个段寄存器支持从其他寄存器中赋值,但不允许立即数直接赋值给段寄存器)

③[bx]作为偏移地址位bx的内存单元,它支持的段地址默认是存储在ds段寄存器中的。此题中ds:[bx]指向的是存储代码段的内存单元。由于ds被占用了,故被写入的内存单元的段地址就没有存储的段寄存器了,es寄存器就存储了地址为0020H的段地址(目标内存段),那么就要使用段前缀,故es:[bx]就指向了内存是0200H的内存单元地址段。

实验步骤:

①首先给cx寄存器任意赋值,bug调试该程序,假如这个可执行程序为2.exe

②debug 2.exe

使用r命令显示寄存器状态,显示整个程序代码所占字节数。

发现cx=001CH

③使用u命令显示汇编指令,求出需要复制的机器码的字节数

我们发现mov ax,4c00h和int 21h总共有10位16进制数,2位16进制数是8位二进制,一个字节,10位就是5个字节,所以我们需要复制的代码字节数是001CH-0005H=0017H,23个字节,故cx计数寄存器赋值23或17H。

所以完整的汇编代码应如图:

执行之后,

对比前面代码



版权声明:本文为K17010原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。