鱼C论坛

 找回密码
 立即注册
查看: 3063|回复: 16

[已解决]汇编语言书中代码问题,如图

[复制链接]
发表于 2017-2-13 15:25:47 | 显示全部楼层 |阅读模式

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

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

x
如图,书中代码只写了assume cs:code 却没写ss:stack,这样也是可以的吗?
最佳答案
2017-2-15 23:04:01
本帖最后由 从善如登 于 2017-2-15 23:07 编辑

这样是可以的,我亲自试了,如图。
我定义了两个段,第一个是数据段data,第二个是代码段code。虽然assume后面只关联了CS:code,但编译后没有错误,debug也可以调试。
而且这两个段是相连接的,data段开始地址为0B430H,code段开始地址为0B440H(如前两张图)。第三个图中,我没有定义ds:data,但是我成功的把data段地址给了ds寄存器,最后ds寄存器的值从0B33H→0B43H(如图三)。
综上,书中的代码是可行的,可能不太严谨。
QQ截图20170213152209.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-13 15:26:26 | 显示全部楼层
新手,求大神指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-15 09:42:00 | 显示全部楼层
大神快来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-15 15:26:30 | 显示全部楼层
有人知道吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-15 22:55:29 | 显示全部楼层
H:\Users\YD\Desktop\1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-15 23:04:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 从善如登 于 2017-2-15 23:07 编辑

这样是可以的,我亲自试了,如图。
我定义了两个段,第一个是数据段data,第二个是代码段code。虽然assume后面只关联了CS:code,但编译后没有错误,debug也可以调试。
而且这两个段是相连接的,data段开始地址为0B430H,code段开始地址为0B440H(如前两张图)。第三个图中,我没有定义ds:data,但是我成功的把data段地址给了ds寄存器,最后ds寄存器的值从0B33H→0B43H(如图三)。
综上,书中的代码是可行的,可能不太严谨。
1.JPG
2.JPG
3.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-15 23:05:55 | 显示全部楼层
从善如登 发表于 2017-2-15 23:04
这样是可以的,我亲自试了,如图。
我定义了两个段,第一个是数据段data,第二个是代码段code。虽然assume ...

上面最后一句话有误,应为”最后ds寄存器的值从0B33H→0B43H(如图三)”。

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

使用道具 举报

 楼主| 发表于 2017-2-16 10:15:21 | 显示全部楼层
从善如登 发表于 2017-2-15 23:05
上面最后一句话有误,应为”最后ds寄存器的值从0B33H→0B43H(如图三)”。

多谢大神,我之所以没有实际操作是因为我是win7 64的系统,没安装debug。  另外图三指令为什么是从data段执行的,前面既然assume cs:code指定了代码段,不应该从代码段第一行执行吗?(没指名入口的情况下)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 18:45:47 | 显示全部楼层
guohuo888meng@1 发表于 2017-2-16 10:15
多谢大神,我之所以没有实际操作是因为我是win7 64的系统,没安装debug。  另外图三指令为什么是从data段 ...

CPU从程序汇编指令的第一个开始执行。为何?因为end后面没有类似于start的标号,所以编译器翻译的信息中CS:IP=0B43:0000。如果把start:放在data段中,CPU还是将从data段的汇编指令开始执行(此时CS:IP依然为0B43:0000),若start:在code段的第一条指令前,此时CS:IP为0B44:0000。总之,所有的汇编指令加载到内存中,对CPU而言都只是机器码01而已,CPU怎么执行是靠CS:IP来决定,而伪指令和标号(end start) 会被编译器翻译成CS:IP的机器码来决定程序从哪里开始执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 19:30:43 | 显示全部楼层
guohuo888meng@1 发表于 2017-2-16 10:15
多谢大神,我之所以没有实际操作是因为我是win7 64的系统,没安装debug。  另外图三指令为什么是从data段 ...

系统会给你分配一个默认的栈区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-17 10:08:57 | 显示全部楼层
从善如登 发表于 2017-2-16 18:45
CPU从程序汇编指令的第一个开始执行。为何?因为end后面没有类似于start的标号,所以编译器翻译的信息中C ...

谢谢,既然是这样的,图3代码开头的assume  cs:code能起到什么作用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 14:08:37 | 显示全部楼层
可以的,这是定义了一个栈段,你好好看看那前面基础吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-17 14:38:29 | 显示全部楼层
A小小鸟 发表于 2017-2-17 14:08
可以的,这是定义了一个栈段,你好好看看那前面基础吧

谢谢你的回答,请问代码开头的assume  cs:code能起到什么作用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 19:06:39 | 显示全部楼层
目前还不弄清楚,等哪天清楚了,再回来答复你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 19:08:48 | 显示全部楼层
体会一下这张图中CS:IP跟前三张图的CS:IP差别。
4.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-18 11:29:11 | 显示全部楼层
guohuo888meng@1 发表于 2017-2-17 14:38
谢谢你的回答,请问代码开头的assume  cs:code能起到什么作用?

开头的assume cs:code,其实是个伪指令,这是一个假设,为后面的汇编语句提供一个接口而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-21 22:06:16 | 显示全部楼层
A小小鸟 发表于 2017-2-18 11:29
开头的assume cs:code,其实是个伪指令,这是一个假设,为后面的汇编语句提供一个接口而已

奥奥,明白了,谢谢·
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 20:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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