(1)编程,向内存 0:200 ~ 0:23F 依次传送数据 0 ~ 63(3FH)。
(2)编程,向内存 0:200 ~ 0:23F 依次传送数据 0 ~ 63(3FH),程序中只能使用 9 条指令,9 条指令中包括 “mov ax,4c00h” 和 “int 21h”。
第一题与第二题的答案一样,故写在一起。
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s:mov ds:[bx],bl
inc bx
loop s
mov ax,4c00H
int 21h
code ends
end
(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,16H
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00H
int 21h
code ends
end
Debug前内存 0:200 处的内容均为空,如下图所示:
Debug后,内存 0:200 处的内容如下所示:
问题:
(1)复制的是什么?从哪里到哪里?
复制的是 CS:IP 所指向的内存地址的数据。由下图可以看出,CS:IP 的初始指向位置是 076A:0000 。所以是从内存地址 076A:0000 处复制到内存 0:200 处。
(2)如何知道要复制的字节数量?
两种方式。
方式一,
随便给 cx 寄存器传送一个值,然后通过 Debug 该程序,来直接查看该程序所占字节数量。
方式二,
通过计算获取程序的字节数量。因为不同的指令占的字节数是固定的,以本题程序为例。
mov ax,cs ;占两个字节
mov ds,ax ;同上
mov ax,0020H ;占三个字节
mov es,ax ;占两个字节
mov bx,0 ;占三个字节
mov cx,16H ;占三个字节
s:mov al,[bx] ;占两个字节
mov es:[bx],al ;其中段前缀占一个字节,mov [bx],al 占两个字节
inc bx ;占一个字节
loop s ;占两个字节
根据以上统计发现可知,
对于 mov 指令而言,如果其中有一个参数为常数或含有段前缀,则其三个字节,其余情况为两个字节。
而 inc 指令固定占一个字节,loop 指令固定占两个字节。