实验4 第三题 自己的见解 不懂得朋友大家进来看看把吧
(3) 下面的程序功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试.
下面是我用debug的调试,大家可以看一下. (下面有解析哦!)
-R
AX=0000BX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13DBES=13DBSS=13EBCS=13EBIP=0000 NV UP EI PL NZ NA PO NC
13EB:0000 8CC8 MOV AX,CS
-U
13EB:0000 8CC8 MOV AX,CS
13EB:0002 8ED8 MOV DS,AX
13EB:0004 B82000 MOV AX,0020
13EB:0007 8EC0 MOV ES,AX
13EB:0009 BB0000 MOV BX,0000
13EB:000C 83E905 SUB CX,+05
13EB:000F 8A07 MOV AL,
13EB:0011 26 ES:
13EB:0012 8807 MOV ,AL
13EB:0014 43 INC BX
13EB:0015 E2F8 LOOP 000F
13EB:0017 B8004C MOV AX,4C00
13EB:001A CD21 INT 21
13EB:001C 0000 ADD ,AL
13EB:001E 0000 ADD ,AL
--R
AX=0000BX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13DBES=13DBSS=13EBCS=13EBIP=0000 NV UP EI PL NZ NA PO NC
13EB:0000 8CC8 MOV AX,CS
-TAX=13EBBX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13DBES=13DBSS=13EBCS=13EBIP=0002 NV UP EI PL NZ NA PO NC
13EB:0002 8ED8 MOV DS,AX
-TAX=13EBBX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=13DBSS=13EBCS=13EBIP=0004 NV UP EI PL NZ NA PO NC
13EB:0004 B82000 MOV AX,0020
-TAX=0020BX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=13DBSS=13EBCS=13EBIP=0007 NV UP EI PL NZ NA PO NC
13EB:0007 8EC0 MOV ES,AX
-TAX=0020BX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=0009 NV UP EI PL NZ NA PO NC
13EB:0009 BB0000 MOV BX,0000
-AX=0020BX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=000C NV UP EI PL NZ NA PO NC
13EB:000C 83E905 SUB CX,+05
-TAX=0020BX=0000CX=0017DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=000F NV UP EI PL NZ NA PE NC
13EB:000F 8A07 MOV AL, DS:0000=8C
-TAX=008CBX=0000CX=0017DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=0011 NV UP EI PL NZ NA PE NC
13EB:0011 26 ES:
13EB:0012 8807 MOV ,AL ES:0000=00
-TAX=008CBX=0000CX=0017DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=0014 NV UP EI PL NZ NA PE NC
13EB:0014 43 INC BX
-TAX=008CBX=0001CX=0017DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=0015 NV UP EI PL NZ NA PO NC
13EB:0015 E2F8 LOOP 000F
-P
AX=00F8BX=0017CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=0017 NV UP EI PL NZ NA PE NC
13EB:0017 B8004C MOV AX,4C00
-TAX=4C00BX=0017CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13EBES=0020SS=13EBCS=13EBIP=001A NV UP EI PL NZ NA PE NC
13EB:001A CD21 INT 21
-PProgram terminated normally分析:这道题让我们复制 mov ax,4cooh int 21h之前的指令.就是复制从1-10(我写的序号)的指令 一开始的编程信息很简单就不写了,直接写代码: 1 mov ax,cs(因为程序刚开始是执行cs:ip的命令所以我们要先获得cs值,这点大家如果有点不理解,可以看一下上面我用debug调试的程序,不过我认为大家看完我写的解析后,最好亲自写写代码调试一下,这样做会更好的理解{:5_109:})2 mov ds,ax(将一开始cs的值赋给段寄存器ds)3 mov ax,20h 4 mov es,ax(因为最后我们要把这10行代码复制到0:200处,所以要把段地址20赋给es. 注:0:200可以变成20:0) 5 mov bx,0(赋值给偏移地址)6 sub cx,5( 6行可以解释为cx=cx-5这里为什莫要减5呢?11-12占5个长度,又因为我们要循环复制的是1-10行代码.但是程序一开始cx是1-12行代码长度所以循环的长度应该减5.<这点大家可以看上边的debug调试>这点大家一定要明白啊.当然如果你知道1-10行代码长度也可以直接赋给它值 .楼主我看不懂 所以就用了这种方法(*^__^*) 嘻嘻……)7 s: mov al, ((ds)*16+(bx))=(al) 应该都看懂吧 8 mov es:,al (al)=((es)*16+(bx))9 inc bx bx=bx+110loop s 这个大家一定都懂11mov ax,4cooh12 int 21h这是算法大家可以看一下: 为了大家方便,我就不隐藏内容了, 但是请大家都回复我一下,顶我我一下, 因为这是我花了好长时间才发的帖. 谢谢了!{:5_108:} 还有大家如果对这道题还有问题,可以在本帖发一下,大家会为你解答的. 还有如果本帖有错误欢迎大家指出来,谢谢le! 好了最后祝大家在汇编路程上一起加油一起奋斗!{:5_109:}
思路清晰,排版牛B。 顶一下,楼主厚道。 cx可以直接赋值,不用减这么麻烦,还不太好理解。(虽然看懂了很简单) 还是有点不理解位答案的mov CX 17
17怎么来的 感谢楼主啊。 涨知识!!谢谢LZ的分析,辛苦撒~~ 编译连接生成EXE文件后,debug这个EXE文件,用r查看寄存器内容时有以下几个寄存器需注意,CX内容时程序长度,DS与CS相差10h,这是由于PSP的原因。楼主定义的序号11-12正好占了5byte,CX-5就是要复制内容的大小,也就是要循环次数,因为下面复制是按byte进行的。 那个cs 解释的不太好直接17就行了
学习了,要好好学汇编 思路清晰,排版牛B。 顶一下,楼主厚道。 楼主那个mov cx,17怎么理解? 赞 学习啦 楼主 按楼主的思路还是比较清晰些 LZ这第7,8行代码后面的两句话解释说反了吧。。。。我的理解应该是这样的吧:
mov al, (al) = ((ds)*16 +(bx)) 意思是把ds:bx中的内容送入al
mov es:,al ((es)*16 + (bx)) = (al) 意思是把al中的内容送入es:bx
大家一起学习,不知道我说的是不是这样的:smile:smile:smile ehj123456@sina.com 多多指教 ck329054222 发表于 2013-8-5 19:29
cx可以直接赋值,不用减这么麻烦,还不太好理解。(虽然看懂了很简单)
其实仅需要11条代码就可以执行这个程序
assume cs:codesg
codesg segment
start:mov ax,cs
mov ds,ax
mov bx,0
mov ax,20h
mov es,ax
s:mov al,
mov es::al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start 本帖最后由 NBeeeeee 于 2018-6-12 15:53 编辑
。