(一)编程,向内存 0:200 ~ 0:23F 依次传送数据 0 ~ 63,程序中只能使用 9 条指令,9 条指令包括 mov ax,4c00H 和 int 21H。编程
思路:oop
assume cs:code code segment mov ax,0020h mov ds,ax mov bx,0h mov cx,64 s: mov [bx],bl inc bx loop s
mov ax,4c00h int 21h code ends end
这题有两个要注意的地方:spa
(二)下面的程序的功能是将 mov ax,4c00H 以前的指令复制到内存 0:200(0020:0) 处,上机调试,跟踪程序运行结果。调试
assume cs:code code segment mov ax , ( ) ; ax 里面应该存放的是指令的首地址的段地址 mov ds , ax mov ax , 0020h
mov es , ax mov bx , 0 mov cx , ( ) ; cx 里存放的是总共要复制的字节数 s: mov al , [ bx ] mov es: [ bx ] , al inc bx loop s mov ax , 4c00h int 21h code ends end
为了完成这道题, 须要解决下面 3 个问题:code
很显然,须要复制的是内存中的字节,复制方向是从内存到内存。可是须要先将数据传入寄存器中做为中转。从上面的程序能够知道,这个中转寄存器是 AL。blog
至于有多少个字节,能够先将第二个空随便添上一个数,程序加载如内存后,查看 CX 寄存器中的值,则是程序的总字节数,再减去最后两条指令的字节数。内存
因为是要复制当前程序,因此确定得知道当前程序被加载如内存后的地址,CS 段寄存器中存储的是指向程序代码段的段地址,故将 CS 寄存器中的指向代码的段地址赋值给 DS(经过 AX 中转)。class
[ bx ] 做为偏移地址为 BX 的内存单元,它支持的段地址默认是存储在 DS 段寄存器中的。变量
本例中 ds:[bx] 指向的是存储代码段的内存单元(源内存段)。因为 DS 被占用了,因此目标内存单元的段地址就没有存储的段寄存器了,这时可使用 ES 寄存器。若是一样使用 [bx] 偏移地址的话,必须明确的指出它的前缀,故es:[bx]就指向了内存是0200H的内存单元地址段。程序
综上,完成的程序应该为以下:
assume cs:code code segment mov ax , cs mov ds , ax mov ax , 0020h mov es , ax mov bx , 0 mov cx , 23 s: mov al , [ bx ] ; 不写段地址默认的是 ds mov es: [ bx ] , al inc bx loop s mov ax , 4c00h int 21h code ends end