鱼C论坛

 找回密码
 立即注册
查看: 2345|回复: 13

汇编语言实验4的问题啊,真心想不明白了

[复制链接]
发表于 2013-8-25 17:28:06 | 显示全部楼层 |阅读模式
50鱼币
QQ截图20130825172817.png 第一问和第二问给仔细讲讲

最佳答案

查看完整内容

教你一个最笨的办法,数字节 这题目的意思是把代码段的代码复制到内存0:200处 如果要复制,肯定得先知道代码段处的地址 可以通过mov ax, cs或者mov ax,code得知,所以第一个填空处就是这个。 cx里面存放的是代码的长度,第二个填空处先瞎填吧,反正我们也不知道mov ax,4c00h之前的代码到底占几个字节 ,我们也不知道mov ax,4c00h和int 21h到底占几个字节 所以第二个填空就随便填个mov cx,0吧 接着编译源码 从图中 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 17:28:07 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-8-25 22:32 编辑

教你一个最笨的办法,数字节

这题目的意思是把代码段的代码复制到内存0:200处

如果要复制,肯定得先知道代码段处的地址
可以通过mov ax, cs或者mov ax,code得知,所以第一个填空处就是这个。
cx里面存放的是代码的长度,第二个填空处先瞎填吧,反正我们也不知道mov ax,4c00h之前的代码到底占几个字节
,我们也不知道mov ax,4c00h和int 21h到底占几个字节
所以第二个填空就随便填个mov cx,0吧
接着编译源码

                               
登录/注册后可看大图


从图中可以看出cx为001D 十进制为29 这说明这段代码占29个字节
然后你可以数代码占的字节数了。mov ax,4c00h 的机器码为B8004C 3个字节
int 21h为CD21 占两个字节
接着用CX-5=29-5=24=18H 所以这下我们可以知道CX的正确值为18H了
或者你不嫌麻烦还可以挨个数mov ax,4c00h之前的代码占的字节数,也会得出是24个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 18:00:08 | 显示全部楼层
题目说将mov ax,4c00h之前的指令复制到内存0:200处因为指令在内存里都是数据所以复制的是数据,从哪复制到哪,这个看哪个一条程序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 19:10:10 | 显示全部楼层
O(∩_∩)O~ 我先给你个《王爽《汇编语言》第二版习题答案》讲的还算详细的
http://1000eb.com/osu7
看了不懂再问吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 21:18:56 | 显示全部楼层
代码和数据在内存中都是以二进制的形式存在的。
区别在于,cs 指向的二进制,那就是代码。
而 ds 指向的二进制,那就是数据。

题目是要求你填空,题中有两个空白处。
一个在code segment 下行的 mov ax,?
另一个则是 mov bx,0 下行的 mov cx,?
至于复制的是什么,从哪里到哪里?
题目已经写出来了,要将 mov ax,4c00H 之前
的代码复制到 0:200 处。那么你可以将 mov ax,4c00H 之前的代码当成数据来看。
总共有多少个字节。
要怎么确定代码所在的地址?
这就是题目的要点,如果不懂,建议你复习,直接给出答案给你,对你不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 21:24:25 | 显示全部楼层
题目就是说,从code segment 开始,到 loop s 这段代码在内存中不是以二进制的形式保存的吗,将这段二进制代码复制到内存0:200处,也就是这段程序复制的是程序自身。多少个字节完全就是代码指令长度了,至于如何知道,我也不太清楚了。每条指令的长度相加?每条指令的操作码的长度,加上每条指令的操作数的长度。这要是数的话题目也就忒没水平了吧,坐等高人吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 22:00:48 | 显示全部楼层
LinuxDeepin 发表于 2013-8-25 21:18
代码和数据在内存中都是以二进制的形式存在的。
区别在于,cs 指向的二进制,那就是代码。
而 ds 指向的二 ...

我第一个空填写的是cs 用debug查看cx的是19为啥第二空填写17h?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 22:21:31 | 显示全部楼层
萌辉 发表于 2013-8-25 22:00
我第一个空填写的是cs 用debug查看cx的是19为啥第二空填写17h?

直接debug 调试,a 写入代码,然后 u 查看内存,看看代码占用了多少字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 22:30:32 | 显示全部楼层
我就是这么办的可是cx里面是19h啊那为啥填17h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 22:56:41 | 显示全部楼层
福禄娃娃 发表于 2013-8-25 22:31
教你一个最笨的办法,数字节

这题目的意思是把代码段的代码复制到内存0:200处

那复制的程序是mov ax,cs到mov cs的程序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 22:58:22 | 显示全部楼层
不对我的意思是我们填写的第二空所占的字节也包括在内?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 23:23:59 | 显示全部楼层
终于弄明白了,刚刚又编译调试了一下,cx里面是1ch减去mov ax,4c00h 的机器码为B8004C 3个字节
int 21h为CD21 占两个字节等于17h,我在来说一下我的理解,cs:ip指向程序的第一条段地址在cs内,所以把cs的值附给ds,用bx里的内容作偏移地址,bx初始化是0,所以第一个地址是cs:bx。我们如何知道复制的内容最后一个地址是多少?我们就需要知道这个程序的长度。在这里我提出一个疑问,如果ip里面的值不是从0开始的话,哪如何办呢?也就是说我们如何知道这个程序程序地址是连续的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 23:32:14 | 显示全部楼层
谢谢LinuxDeepin 兄弟,福禄娃娃 版主的热心回答和牡丹花下死做鬼 版主的答案,我在去提问一个问题吧,我又有新的疑惑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-28 17:59:55 | 显示全部楼层
xxx学习学习再学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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