(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。
所以完整的汇编代码应如图:
执行之后,
对比前面代码