关于实验五(5)的困惑
本帖最后由 piggie 于 2011-8-21 00:51 编辑在论坛看到的这一段代码:注意红色的字段,第一行是code与代码段关联。那么后面的a,b,c没有关联,他们都在代码段中,段地址应是一样的。那mov ax,a mov es,ax mov ax,c mov ds,ax
是在干什么?a把什么传进了ax,是段地址么?他没有和段关联呀。看了书上的例子,没有这样的。书上的例子都是在一开始都关联好的。困惑,请帮忙解答下。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov ax,a
mov es,ax
mov ax,c
mov ds,ax
mov bx,0
mov cx,8
s1:mov ax,es:
add ,ax
add bx,2
loop s1
mov ax,b
mov es,ax
mov ds,ax
mov bx,0
mov cx,8
s2:mov ax,es:
add ,ax
add bx,2
loop s2
mov ax,4c00h
int 21h
code ends
end start
我是这么理解的:不是必须关联的。一开始的关联不是很必要。下面a segment 是设立A段的意思,不是在代码段。他们是两个段,B.C也一样,下面必须要mov ax,a 这里的是将A段段地址赋给AX。然后再赋给其他段寄存器。CS段,A段,B段,C段是4个不同的段。段地址不同。
{:5_96:}就这个意思。不知道有没有错误。 1、王爽书上第90页关于assume的说明:
“这条伪指令的含义是’假设‘。它假设某一段寄存器和程序中的某一个用segment...ends定义的段想关联。通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。。。“
这段话说得已经很明白了。
2、对于assume cs:code,ds:datasg这样的语句在编译处理过程中并不会被转为机器码,它作为伪指令,它的“关联”仅仅是一种假设。你可以在assume中也写出这样的假设,但因为只是”假设“,所以不写也没关系。而真正实现关联的是:"mov ax,a mov ds,ax"这个语句。你提到的a段,其标号'a'在编译器编译过程中已经被自动转成了a段的段地址。在编译器读到如下指令时候,完成了对标号a赋值段地址的操作:a segment
db 1,2,3
a ends
3、上面1、2点应该能解释你的疑问了。至于标号a被转成的段地址的分析,我在关于自定义的段占用内存空间一文里有过说明和个人的理解;可惜没人去看。
本帖最后由 piggie 于 2011-8-21 16:46 编辑
谢谢,有点明白了, 其标号'a'在编译器编译过程中已经被自动转成了a段的段地址
,我怎么没看到这样的描述啊。 这句话我在书上确实也没见过,只是我自己的判断。。
但我觉得这个判断应该没有问题。。。
首先,可以确定的是mov ax,a这个语句中的a是a段的段地址;这在书上有提过,当然我们也可以通过debug看出来;
其次,涉及‘a'的指令就以下三个:
1、assume ds:a
这句是伪指令,在书上已有说明,只是预先假设;其次这语句出现时候的a还未进行定义;编译器在该语句时候无法定位a.
2、a segment
db...
a ends
3、mov ax,a
mov ds,ax
这句只是传输指令,如果编译器在进行到这一步再去赋值a的话,编译器还得重新回到2步去解析。。
所以,只能是在上述2句编译的时候对a进行了赋值。。
我是来看 我是不是VIP的
a b c他定义的数据 编译器会把a b c 翻译成一个段地址 并不是他存在当前段地址种 又是a,b,c段没有定义的问题,这个都是基础,书本有些地方也是错的 不懂!!!!!!!!
页:
[1]