zhouyuelun 发表于 2014-1-10 14:14:08

王爽汇编第二版 实验5(6)的疑惑

实验5 编写、调试具有多个段的程序(6)程序如下,编写code段中代码,用PUSH指令将A段中的前8个字型数据,逆序存储到B段中。assume cs:codea segment    dw 1,2,3,4,5,6,7,8a endsb segment    dw 0,0,0,0,0,0,0,0b endscode segmentstart: mov ax,a       mov ds,ax   ;ds指向a段       mov ax,b       mov bx,0    ;ds:bx指向a段的第1个单元       mov ss,ax       mov sp,16   ;设置栈顶指向b:16       mov cx,8    s: push        add bx,2       loop s      ;将a段中0~16个单元逆次入栈code endsend start 以上为网络答案,这段内容中定义了a段和b段,并且把b段当作栈来使用了,请问为什么第一行只有assume cs:code 按照道理第一行应该是 assume cs:code,ds:a,ss:b 难道说这些假设关联"ds:a,ss:b"可有可无吗? 请教各位高手,小弟在此谢谢了!

lms99251 发表于 2014-1-10 14:42:41

我在百度了下,发现这个答案感觉比较合意
“assume只是告诉编译器用的,我感觉在8086汇编下没什么大作用,在win32汇编下作用就大了,主要用来关联结构体等数据”

zhouyuelun 发表于 2014-1-10 15:00:18

lms99251 发表于 2014-1-10 14:42 static/image/common/back.gif
我在百度了下,发现这个答案感觉比较合意
“assume只是告诉编译器用的,我感觉在8086汇编下没什么大作用, ...

谢谢,不过还是没有正面回答我的问题。

dlzhwm 发表于 2014-1-11 01:21:46

本帖最后由 dlzhwm 于 2014-1-12 00:13 编辑

以上为网络答案,这段内容中定义了a段和b段,并且把b段当作栈来使用了,请问为什么第一行只有assume cs:code

因为分段和段名是编程者决定的,只是通过assume cs:code伪指令告诉编译器CODE(也可以起别的名称)是代码段而已,编译器就会把CODE所在段地址给CS。

按照道理第一行应该是 assume cs:code,ds:a,ss:b

理解太机械,A不可以定义为SS:A吗?B不可以定义为DS:B吗?不是规定要这样,是编程者自己
如何使用就如何定义。

难道说这些假设关联"ds:a,ss:b"可有可无吗?

这要看编程者和解决问题的需要而定。也可以说在第一行"ds:a,ss:b"可有可无。
希望对你有帮助。

sd53852728 发表于 2014-1-13 21:19:54

计算机要知道一个程序从哪里开始就要知道end后面接的是什么 而end后面接的就是一个程序的开始 这个开始是一个标号 assume告诉编译器 那些段有标号 一个程序必须要有代码 所以要有个开始 所以assume cs:****必须要 而段是程序员假想的
不知道是不是你想要的

zhouyuelun 发表于 2014-1-15 09:08:53

sd53852728 发表于 2014-1-13 21:19 static/image/common/back.gif
计算机要知道一个程序从哪里开始就要知道end后面接的是什么 而end后面接的就是一个程序的开始 这个开始是一 ...

首先谢谢你的回答,我还是想追问一下,如果同样是定义了多个段,但是assume不申明这些段也是可以的,而申明了会让指令显得很有条理性? 最后就是说申明与不申明是根据具体情况而定的,我这样理解对吗?

sd53852728 发表于 2014-1-15 12:47:31

也算是对的吧:shock:

zhaopengfei 发表于 2014-1-15 20:42:36

这都是些什么回答啊,自己不懂看看就得了,不要出来误导别人好不啦,这是我的感觉,不要喷我,没意思。
页: [1]
查看完整版本: 王爽汇编第二版 实验5(6)的疑惑