当前位置: 代码迷 >> 汇编语言 >> 超级小白,王爽汇编里一个简单题目,前辈,多谢了
  详细解决方案

超级小白,王爽汇编里一个简单题目,前辈,多谢了

热度:8602   发布时间:2013-02-26 00:00:00.0
超级小白,王爽汇编里一个简单题目,请教各位前辈,谢谢了!
超级小白,王爽汇编里一个题目,请教各位:
问题一:
向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“MOV,ax,4c00h”和“int 21h”

我的指令要超过9条,请问怎么做才能符合条件呢?

问题二:
下面程序功能是将“mov,ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
assume cs:code
code segment
mov ax,____(我填CS)
mov ds,ax
mov ax,0020h
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
我对上面程序理解不透彻,按我理解:
1.内存中指令在执行之前,CUP中CS:ip便指向了第一条指令,我在第一个空中填CS,读取指令存放的段地址,若这样理解,下面的bx=0, 从偏移地址为零的地方开始读取,岂不是默认了ip=0(我认为应该是mov bx,ip)
2.4c00h之前指令的长度我也不知道啊,怎么来确定cx=?
请各位指点迷津,谢谢了!

------解决方案--------------------------------------------------------
问题一:
assume cs:code
code segment
mov ax, 20h
mov ds, ax
mov bx, 0 ;将ds:[bx]=0:200h~0:23fh用20h:0~20h:3fh描述,
;就是为了使目标单元的偏移地址和源单元地址从同一数值0开始
mov cx, 64 ;循环次数64次:0~3fh
s: mov ds:[bx], bl ;因为bx=0 则bl=0
inc bl ;所以通过修改一个寄存器bl,
loop s ;实现同时改变bl的值和ds:[bx]中的偏移地址

mov ax,4c00h
int 21h

code ends
end
问题二:
1.第一个空填CS是对的,因为默认的这个程序是.exe文件加载到内存时偏移地址为0,即cs:ip为cs:0,你的意思是对的---默认了ip=0(我认为应该是mov bx,ip),但是mov bx,ip非法
2.4c00h之前指令的长度有两种确定方法,这个题得意思应该是让你通过debug调出来
1)调试法:在debug下用a命令把"mov ax,4c00h"之前的指令输入到内存。输入时,cx可随意给个值,输入完毕,用loop指令的下一条指令的地址117减去100(17H),即为cx应该赋的值,即mov cx,17h
2)标号法:
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,offset exit
sub cx,offset start
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
exit:
mov ax,4c00h
int 21h
code ends
end Start
  相关解决方案