实验1
编程,向内存0:200~0:23F依次传送数据0~63(3FH)。
本质就是向一段连续的内存单元中传送一段连续的数据,所以我一开始就让段地址为0,再将偏移地址定义后递加。为了减少代码数量,让ax身兼两职:为ds赋值和当累加器。
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,200h
mov cx,40h
s: mov [bx],al
inc bx
inc ax
loop s
mov ax,4c00h
int 21h
code ends
end
实验2
编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括"mov ax,4c00h"和"int 21h"。
显然只能在寄存器的一器多用上下文章,仔细观察发现,若将段地址置为20h,偏移地址与要传送的数据一样都是0~63。
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,40h
s: mov [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,___
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
要复制指令,就要找到第一条指令所在位置,可知cs:ip指向的是第一条指令。第一个空填cs。cx是循环次数,将代码debug运行一下,看到"mov ax,4c00h"之前占了多少空间
占了17个字节,所以cx后面填17
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,17
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
(1)复制的是指令,从"mov ax,cs"到“loop s”从cs:ip开始,到cs:cx结束
(2)有17个字节,debug查看指令在内存中的存储情况可以得到