(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处,补全程序。上机调试,跟踪运行结果。
程序分析:
【1】内存0:200H~0:23fH空间与0020:0-0020:3f内存空间是一样的,(物理地址是唯一的,但逻辑地址组合是多种的。)
【2】因为偏移地址是连续内存单元;我们可以把偏移地址做下文章。bx寄存器存储偏移地址(通过偏移地址的间接访问内存单元,这主要是写入的内存单元)。dx寄存器作为存储中间变量的容器(源数据,常量0-63)来向内存写入。
(1)编程,向内存0:200~0:23f依次传送数据0~63.
assume cs:code code segment mov ax,0020H mov ds,ax ;内存单元的段地址写入ds寄存器 mov bx,0 ;bx寄存器存放偏移地址,初始化为0 mov dx,0 ;dx寄存器存储常量数值0~63 mov cx,40H ;这里40H==64,cx寄存器存放循环次数。也可以为64; s: mov [bx],dx ;向[bx]内存单元写入dx值 inc bx ;累加bx inc dx ;累加dx loop s mov ax,4c00H int 21H code ends end
(3)程序功能是将"mov ax,4c00h"之前的指令复制到内存0:200处,补全程序:
程序分析:
内存0:200H~0:23fH空间与0020:0-0020:3f内存空间是一样的,为什么这样?数据0-63是64个连续的数字,0-3fH也是连续的64个编号。我们可以使用一个bx变量就把偏移地址和数字的递增
;只写关键代码 ;每次复制单字节数据,并通过al中转 ;程序入口为cs:0(ip=0),所以第一空处传递段地址为cs ;接下来需要确定循环次数,即mov ax,4c00h之前的代码长度 ;而程序总代码长度可通过debug加载后通过u命令看出 ;先将第二空位随便设为1,加载后观察mov ax,4c00h之前代码为0000~0016h,总长度为23. assume cs:code code segment mov ax,0020H mov ds,ax ;ds指向0020内存段 mov bx,0 ;bx寄存器存放偏移地址,初始化为0,也当做源数据:常量数值 mov cx,64 ;循环次数64 s: mov [bx],bx ; 向[bx]内存单元写入bx数值 inc bx loop s mov ax,4c00H int 21H code ends end
结果
-d ds:0 0020:0000 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................ 0020:0010 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................ 0020:0020 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 0020:0030 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>?