. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->基础知识
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  只有2行程序,是哪里出错了?  [已解决] 回复[ 4次 ]   点击[ 279次 ]  
hzd1990
[帖 主]   [ 发表时间:2009-10-26 23:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:20
注册日期:2009-10-19 12:21
数据段放的是 msg db 'This si first string.'
代码段  count equ $-msg
       mov cl,count 
运行后 mov cl,count 这行有错?不知道错在哪里?求高手!!!
aibaodong1
[第1楼]   [ 回复时间:2009-10-27 08:48 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:0
注册日期:2009-10-26 16:27
应该是 数据段有错误  $代表指令指针当前值,而你把count放在了代码段 你尝试把count放在msg后面!!
scuzg
[第2楼]   [ 回复时间:2009-10-27 10:30 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
这个问题1楼说的对:count equ $-msg 是为了获取字符串msg的长度,而$是“编译指针”(和1楼商榷,不是“指令指针”)的当前值,编译程序扫描了

msg db 'This si first string.'

后,$就是串'This si first string.'之后的第一个字节的偏移量,所以如果两条语句按下述顺序紧靠在一起,即这样:

msg db 'This si first string.'
count equ $-msg

那么编译完成后,count将是串msg的长度。如果这两句分开了,甚至不在一个段,在编译:

count equ $-msg

时,$就是一个和串msg长度无关的一个什么数,编译完成后count就不会是msg的长度。

我来此贴的目的不是回复上述问题,而是我们在讨论“怎么查看下面数的偏移量?”的问题时,你提到:“再问一下你:你在定义堆栈段的时候

      dw     40h dup(0)

40是怎么来的?是不是要通过计算?”
    由于那个问题你已经结帖,无法回复,所以我只有在这个帖子“搭车”了:
    上述40h那个值,是堆栈的深度,即连续压栈次数的上限。超过了这个值,就是“堆栈溢出”,将导致程序错乱、死机等严重的软件故障。所以这个值显然不能是一个精确值,而应该是一个让程序使用堆栈“绰绰有余”的相对大的数值,让堆栈有足够的深度应付程序对堆栈的使用需求,并留有相当的富裕量以确保堆栈溢出不会发生。40h可压栈64次,对于一般练习来说,太“奢侈”了,完全不用担心堆栈溢出的的问题。
hzd1990
[第3楼]   [ 回复时间:2009-10-28 21:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:20
注册日期:2009-10-19 12:21
呵呵,谢谢你了
hzd1990
[第4楼]   [ 回复时间:2009-11-05 09:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:20
注册日期:2009-10-19 12:21
此贴由 贴主 于 [ 2009-11-05 09:30 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(aibaodong1):3分   2楼(scuzg):3分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved