本人使用的是emu8086软件完成的实验。
(1)编程,向内存0:200~0:23F依次传送数据0~63(3FH)
assume cs:code
code segment
mov ax,0000H
mov ds,ax
mov bx,200H
mov dx,0
mov cx,64
s: mov [bx],dx
inc bx
inc dx
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”
先看代码
assume cs:code
code segment
mov ax,0000H
mov ds,ax
mov bx,200H
mov cx,64
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,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,0FH
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
分析:该程序是将指令复制到了内存0:200,乍一听,感觉很懵逼。其实仔细结合前面的知识,也就很容易了。
首先,指令全部都是二进制表示。其次,cs:ip表示cpu执行指令的地址。所有,只要mov ax,cs 就能把该程序在内存里的首地址mov到ax了。
第二个空.cx的值,也就是loop循环执行多少次。当程序运行到第8行,也就是mov cx,__ 时,cs:ip是该指令的地址。也就是说,从程序开始IP=0,到第8行,IP的值可以用来表示该程序(需要复制的一部分)指令占多少字节。但是上机调试发现,IP的值是不能使用的。所有只能debug得到IP的值。
版权声明:本文为weixin_41256413原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。