鱼C论坛

 找回密码
 立即注册
查看: 14786|回复: 57

[汇编作业] 实验4 第三题 自己的见解 不懂得朋友大家进来看看把吧

[复制链接]
发表于 2013-8-4 11:44:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
3812b31bb051f81985eb31f3dbb44aed2f73e7b8.jpg

(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!     
                    好了最后祝大家在汇编路程上一起加油一起奋斗!
                                          


评分

参与人数 5荣誉 +18 鱼币 +18 贡献 +12 收起 理由
今天怎么不开心 + 5 + 5 + 3 鱼C有你更精彩^_^
兰陵月 + 5 + 5 + 3 感谢楼主无私奉献!
jianqiumy + 5 + 5 + 3 感谢帮我解决了为什么要用CS的问题~辛苦了
狂潮丶 + 1 + 1 + 1 感谢楼主无私奉献!
Dardy + 2 + 2 + 2 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-4 14:09:26 | 显示全部楼层
思路清晰,排版牛B。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-4 14:35:15 | 显示全部楼层
顶一下,楼主厚道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-5 19:29:17 | 显示全部楼层
cx可以直接赋值,不用减这么麻烦,还不太好理解。(虽然看懂了很简单)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-6 23:37:44 | 显示全部楼层
还是有点不理解位答案的mov CX 17
17怎么来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-5 15:53:49 | 显示全部楼层
感谢楼主啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-8 04:10:56 | 显示全部楼层
涨知识!!谢谢LZ的分析,辛苦撒~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-13 16:13:26 | 显示全部楼层
编译连接生成EXE文件后,debug这个EXE文件,用r查看寄存器内容时有以下几个寄存器需注意,CX内容时程序长度,DS与CS相差10h,这是由于PSP的原因。楼主定义的序号11-12正好占了5byte,CX-5就是要复制内容的大小,也就是要循环次数,因为下面复制是按byte进行的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-24 21:03:38 | 显示全部楼层
那个cs   解释的不太好  直接17就行了


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-17 19:35:51 | 显示全部楼层
学习了,要好好学汇编
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 17:26:44 | 显示全部楼层
思路清晰,排版牛B。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-24 09:02:38 | 显示全部楼层
顶一下,楼主厚道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-25 14:59:44 From FishC Mobile | 显示全部楼层
楼主那个mov cx,17怎么理解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-29 11:30:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-7 18:20:32 | 显示全部楼层
学习啦 楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-21 08:06:14 | 显示全部楼层
按楼主的思路还是比较清晰些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-21 08:38:18 | 显示全部楼层
LZ这第7,8行代码后面的两句话解释说反了吧。。。。我的理解应该是这样的吧:

mov al,[bx]            (al) = ((ds)*16 +(bx))             意思是把ds:bx中的内容送入al
mov es:[bx],al        ((es)*16 + (bx)) = (al)            意思是把al中的内容送入es:bx

大家一起学习,不知道我说的是不是这样的:smile:smile:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-10-23 21:00:28 | 显示全部楼层
ehj123456@sina.com 多多指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,[bx]
      mov es:[bx]:al
      inc bx
      loop s
      mov ax,4c00h
      int 21h
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-10-24 22:04:58 | 显示全部楼层
本帖最后由 NBeeeeee 于 2018-6-12 15:53 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表