缌唸 发表于 2013-8-4 11:44:31

实验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:}                                           

Dardy 发表于 2013-8-4 14:09:26

思路清晰,排版牛B。

vitamin 发表于 2013-8-4 14:35:15

顶一下,楼主厚道。

ck329054222 发表于 2013-8-5 19:29:17

cx可以直接赋值,不用减这么麻烦,还不太好理解。(虽然看懂了很简单)

生活! 发表于 2013-12-6 23:37:44

还是有点不理解位答案的mov CX 17
17怎么来的

木头人1 发表于 2014-3-5 15:53:49

感谢楼主啊。

gone0308 发表于 2014-5-8 04:10:56

涨知识!!谢谢LZ的分析,辛苦撒~~

kelamoyujuzhen 发表于 2015-1-13 16:13:26

编译连接生成EXE文件后,debug这个EXE文件,用r查看寄存器内容时有以下几个寄存器需注意,CX内容时程序长度,DS与CS相差10h,这是由于PSP的原因。楼主定义的序号11-12正好占了5byte,CX-5就是要复制内容的大小,也就是要循环次数,因为下面复制是按byte进行的。

付世龙 发表于 2015-5-24 21:03:38

那个cs   解释的不太好直接17就行了


hexiaofengye 发表于 2015-6-17 19:35:51

学习了,要好好学汇编

hexiaofengye 发表于 2015-6-21 17:26:44

思路清晰,排版牛B。

fast 发表于 2015-6-24 09:02:38

顶一下,楼主厚道。

薄情寡义 发表于 2015-6-25 14:59:44

楼主那个mov cx,17怎么理解?

youngH 发表于 2015-6-29 11:30:00

laishiba 发表于 2015-9-7 18:20:32

学习啦 楼主

whyinfi 发表于 2015-10-21 08:06:14

按楼主的思路还是比较清晰些

whyinfi 发表于 2015-10-21 08:38:18

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

都是网游的错 发表于 2015-10-23 21:00:28

ehj123456@sina.com 多多指教

NBeeeeee 发表于 2015-10-24 22:03:25

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 发表于 2015-10-24 22:04:58

本帖最后由 NBeeeeee 于 2018-6-12 15:53 编辑

页: [1] 2 3
查看完整版本: 实验4 第三题 自己的见解 不懂得朋友大家进来看看把吧