马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
(3) 下面的程序功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试.
下面是我用debug的调试,大家可以看一下. (下面有解析哦!)
-R
AX=0000 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13DB ES=13DB SS=13EB CS=13EB IP=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,[BX]
13EB:0011 26 ES:
13EB:0012 8807 MOV [BX],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 [BX+SI],AL
13EB:001E 0000 ADD [BX+SI],AL
--R
AX=0000 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13DB ES=13DB SS=13EB CS=13EB IP=0000 NV UP EI PL NZ NA PO NC
13EB:0000 8CC8 MOV AX,CS
-T AX=13EB BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13DB ES=13DB SS=13EB CS=13EB IP=0002 NV UP EI PL NZ NA PO NC
13EB:0002 8ED8 MOV DS,AX
-T AX=13EB BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=13DB SS=13EB CS=13EB IP=0004 NV UP EI PL NZ NA PO NC
13EB:0004 B82000 MOV AX,0020
-T AX=0020 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=13DB SS=13EB CS=13EB IP=0007 NV UP EI PL NZ NA PO NC
13EB:0007 8EC0 MOV ES,AX
-T AX=0020 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=0009 NV UP EI PL NZ NA PO NC
13EB:0009 BB0000 MOV BX,0000
-AX=0020 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=000C NV UP EI PL NZ NA PO NC
13EB:000C 83E905 SUB CX,+05
-T AX=0020 BX=0000 CX=0017 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=000F NV UP EI PL NZ NA PE NC
13EB:000F 8A07 MOV AL,[BX] DS:0000=8C
-T AX=008C BX=0000 CX=0017 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=0011 NV UP EI PL NZ NA PE NC
13EB:0011 26 ES:
13EB:0012 8807 MOV [BX],AL ES:0000=00
-T AX=008C BX=0000 CX=0017 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=0014 NV UP EI PL NZ NA PE NC
13EB:0014 43 INC BX
-T AX=008C BX=0001 CX=0017 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=0015 NV UP EI PL NZ NA PO NC
13EB:0015 E2F8 LOOP 000F
-P
AX=00F8 BX=0017 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=0017 NV UP EI PL NZ NA PE NC
13EB:0017 B8004C MOV AX,4C00
-T AX=4C00 BX=0017 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=0020 SS=13EB CS=13EB IP=001A NV UP EI PL NZ NA PE NC
13EB:001A CD21 INT 21
-P Program terminated normally 分析:这道题让我们复制 mov ax,4cooh int 21h之前的指令.就是复制从1-10(我写的序号)的指令 一开始的编程信息很简单就不写了,直接写代码: 1 mov ax,cs(因为程序刚开始是执行cs:ip的命令所以我们要先获得cs值,这点大家如果有点不理解,可以看一下上面我用debug调试的程序,不过我认为大家看完我写的解析后,最好亲自写写代码调试一下,这样做会更好的理解) 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,[bx] ((ds)*16+(bx))=(al) 应该都看懂吧 8 mov es:[bx],al (al)=((es)*16+(bx)) 9 inc bx bx=bx+1 10 loop s 这个大家一定都懂 11 mov ax,4cooh 12 int 21h 这是算法大家可以看一下:
算法
为了大家方便,我就不隐藏内容了, 但是请大家都回复我一下,顶我我一下, 因为这是我花了好长时间才发的帖. 谢谢了! 还有大家如果对这道题还有问题,可以在本帖发一下,大家会为你解答的. 还有如果本帖有错误欢迎大家指出来,谢谢le! 好了最后祝大家在汇编路程上一起加油一起奋斗!
|