注册 登录
编程论坛 汇编论坛

王爽汇编第二版实验5有些疑问。。。。。!~~

ganbikai 发布于 2011-08-26 16:15, 1060 次点击
只有本站会员才能查看附件,请 登录

这道题目的 a segment  b segment c segment  看不懂他把这些数据定义到那个段中了
18 回复
#2
ganbikai2011-08-26 17:23
刚才想了想 不知道是不是这个意思    a ,b,c  就是定义了3个不同的段  一个段定义了8个字节(16*(n/16+1))=16 所以他的实际空间应该还是16个字节     
所以他们的数据才这么显示:  
                 这是a定义的 CS-3        CS:0000  01 02 03 04 05 06 07 08 00 00 00 00 00 00 00 00
                 这是b定义的 CS-3        CS: 0010  01 02 03 04 05 06 07 08 00 00 00 00 00 00 00 00
                 这是c定义的 CS-3        CS:0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

因为他们是3行伪指令      从CS+3这里才是代码的真正开始   我也不知道说的对不对 请各位告诉下答案  我试过在加上个:
e segment   
     db 1,2,3,4,5,6,7,8
e ends
debug加载程序后 CS加了4
DS=13E1 SS=13F1 CS=13F5        

越打字 越感觉不对劲了  我还是不懂 a segment   b segment   segment   他们定义的数据在那个段中 为什么
                                                                              
                          

[ 本帖最后由 ganbikai 于 2011-8-26 17:36 编辑 ]
#3
ganbikai2011-08-26 17:39
希望有朋友能帮我解答下问题  我怕在往后面学 会看不懂
#4
ganbikai2011-08-26 20:37
刚才看看了别人补充的代码   是不是那个a b c  CPU不认识  在start:那里 mov ax,a  然后 mov ds,ax  那么他就定义在数据段   mov ss,ax  那么那个a就定义在栈段  是这样理解吗
#5
ganbikai2011-08-26 20:38
大哥们  我自己胡思乱想的  我真不敢把他当正确的 求解释啊
#6
zklhp2011-08-26 21:43
16位不懂。。

一般是 数据在数据段里 代码在代码段里呗

至于

e segment

这只不过是告诉编译器的东东罢了 实际在内存/CPU中是体现不出来的
#7
zklhp2011-08-26 21:43
以下是引用ganbikai在2011-8-26 20:37:04的发言:

刚才看看了别人补充的代码   是不是那个a b c  CPU不认识  在start:那里 mov ax,a  然后 mov ds,ax  那么他就定义在数据段   mov ss,ax  那么那个a就定义在栈段  是这样理解吗

不知所云
#8
zklhp2011-08-26 21:46
以下是引用ganbikai在2011-8-26 17:23:30的发言:

刚才想了想 不知道是不是这个意思    a ,b,c  就是定义了3个不同的段  一个段定义了8个字节(16*(n/16+1))=16 所以他的实际空间应该还是16个字节     
所以他们的数据才这么显示:  
                 这是a定义的 CS-3        CS:0000  01 02 03 04 05 06 07 08 00 00 00 00 00 00 00 00
                 这是b定义的 CS-3        CS: 0010  01 02 03 04 05 06 07 08 00 00 00 00 00 00 00 00
                 这是c定义的 CS-3        CS:0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

因为他们是3行伪指令      从CS+3这里才是代码的真正开始   我也不知道说的对不对 请各位告诉下答案  我试过在加上个:
e segment   
     db 1,2,3,4,5,6,7,8
e ends
debug加载程序后 CS加了4
DS=13E1 SS=13F1 CS=13F5        

越打字 越感觉不对劲了  我还是不懂 a segment   b segment   segment   他们定义的数据在那个段中 为什么
                                                                              
                          

你可以试着编译一下 debug u 一看就知道了。。


#9
iamsky19812011-08-26 22:05
(16*(n/16+1))=16 搞不懂你这个16怎么算出来的
这里定义的a, b,c三个段每个段占16个字节,是因为段定义的默认定位类型是PARA,也就是说段起始位置位于可用的第一个节(每节为16个字节)

“在start:那里 mov ax,a  然后 mov ds,ax  那么他就定义在数据段   mov ss,ax  那么那个a就定义在栈段  是这样理解吗”

这个地方不是说定义在哪个段,a段已经定义好了, mov ds, ax只是把a的段地址赋给ds或者ss,让段寄存器指向a段

“从CS+3这里才是代码的真正开始” 此言差矣  CS才是代码的真正开始

总的来说,楼主的基础差那么一点点,建议楼主把基础再复习一下
#10
zklhp2011-08-26 22:09
我搞了一个 但是编译参数不同对这个有影响的 做个参考罢

代码

0B91:0000 B8B20B        MOV     AX,0BB2
0B91:0003 B401          MOV     AH,01
0B91:0005 CD21          INT     21
0B91:0007 B44C          MOV     AH,4C
0B91:0009 CD21          INT     21

我写的是 mov ax,seg a

a的定义和你上面的一样

0BB2:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
0BB2:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
0BB2:0020  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................

可知 数据段分别是这样的 至于你那个什么从哪开始什么的 没看懂。。


[ 本帖最后由 zklhp 于 2011-8-26 22:14 编辑 ]
#11
zklhp2011-08-26 22:10
我觉得你的问题在于 不会实践 “实践是真理的唯一标准”
#12
zklhp2011-08-26 22:15
以下是引用iamsky1981在2011-8-26 22:05:37的发言:

(16*(n/16+1))=16 搞不懂你这个16怎么算出来的
这里定义的a, b,c三个段每个段占16个字节,是因为段定义的默认定位类型是PARA,也就是说段起始位置位于可用的第一个节(每节为16个字节)
 
“在start:那里 mov ax,a  然后 mov ds,ax  那么他就定义在数据段   mov ss,ax  那么那个a就定义在栈段  是这样理解吗”
 
这个地方不是说定义在哪个段,a段已经定义好了, mov ds, ax只是把a的段地址赋给ds或者ss,让段寄存器指向a段
 
“从CS+3这里才是代码的真正开始” 此言差矣  CS才是代码的真正开始
 
总的来说,楼主的基础差那么一点点,建议楼主把基础再复习一下

那个公式代n=0就是了 呵呵
#13
iamsky19812011-08-26 22:17
以下是引用zklhp在2011-8-26 22:15:39的发言:


那个公式代n=0就是了 呵呵

#14
ganbikai2011-08-26 23:55
回复 9楼 iamsky1981
(16*(n/16+1))这个算法是10进制 应该是 (10*(n个字节/10+1))  我理解的就是 只要他不超过16个字节 该段实际空间就是16个字节  超过16个字节 比喻 18个字节  那么该段实际空间就是32个字节。 这个算法是视频的讲师说的  他说也许听者理解起来会有点麻烦  按照C语言的什么什么的 就是这个公式(抱歉原话我忘了

  我刚才到王爽老师的论坛看了看别人的答案  又翻了翻视频   说那个segment前面那个是个标记 那么那个A B C 就是一个标记  
  我又看了看视频  第一句代码是这样  
assume CS:code  DS:data  SS:stack
data segment
      dw XXX,XXX,......省略
data ends

stack segment
      dw XXX,XXX,......省略
stack ends
code segment
start : mov ax,stack
        mov ss,ax
...................
.................省略

他这里是把那里是什么段 都定义好了  看到MOV ax,stack  这句代码 听到讲师说的(讲师怎么说的原话我忘记了) 然后突然记得以前讲师说过 CS指向就是代码段  SS指向就是栈段  DS指向就是数据段  同一个段 他用什么指他就是什么 我一想 这句话我以前根本没理解好啊 我一直在纠结debug加载程序后为什么CS:0这里面的数据不是代码里定义的数据 因为之前学的程序里 我都习惯直接看CS的值来查看定义的数据所以..............(字越打越多了)   既然A是标记  这道题目就是要A+B的值放到C中  那么A就是放那些数据的地址 我用DS指向就行         

[ 本帖最后由 ganbikai 于 2011-8-27 00:03 编辑 ]
#15
ganbikai2011-08-26 23:56
回复 6楼 zklhp
真理啊  我刚才看别人的代码才想起来
#16
ganbikai2011-08-26 23:57
回复 11楼 zklhp
我刚才一直在实践 帖子我发了好久了
#17
ganbikai2011-08-27 00:09
以下是引用iamsky1981在2011-8-26 22:05:37的发言:

(16*(n/16+1))=16 搞不懂你这个16怎么算出来的
这里定义的a, b,c三个段每个段占16个字节,是因为段定义的默认定位类型是PARA,也就是说段起始位置位于可用的第一个节(每节为16个字节)
 
“在start:那里 mov ax,a  然后 mov ds,ax  那么他就定义在数据段   mov ss,ax  那么那个a就定义在栈段  是这样理解吗”
 
这个地方不是说定义在哪个段,a段已经定义好了, mov ds, ax只是把a的段地址赋给ds或者ss,让段寄存器指向a段
 
“从CS+3这里才是代码的真正开始” 此言差矣  CS才是代码的真正开始
 
总的来说,楼主的基础差那么一点点,建议楼主把基础再复习一下
恩 我学到这章  这个实验5 引出了 之前一些没学好的东西
各位晚安
#18
ganbikai2011-08-27 00:09
以下是引用zklhp在2011-8-26 22:10:35的发言:

我觉得你的问题在于 不会实践 “实践是真理的唯一标准”
这道题目刚才实践成功了 但暴露我前面几个视频没理解好  又要重看 悲哀
版主晚安

[ 本帖最后由 ganbikai 于 2011-8-27 00:12 编辑 ]
#19
wary2011-09-25 00:15
我也刚刚看到这章。
a segment  b segment c segment 在代码段( cs:0)而不是在数据段(ds:0)
所以我认为,a segment  b segment c segment 都是作为指令代码
程序就是从a segment开始的
但程序是从cs:ip执行的


1