583413088 发表于 2011-8-8 21:19:07

各位看看 这个代码 咋回事???

本帖最后由 weixianlang 于 2011-8-9 09:54 编辑

assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0
b ends
code segment
start:mov ax, b
mov ss, ax
mov sp, 7
mov ax, a
mov ds, ax

mov bx, 0
mov cx, 8
s: push
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
每次运行到mov ss, ax都是自动退出 啊

这是实验5上面的一个题

NWm 发表于 2011-8-8 23:28:21

本帖最后由 NWm 于 2011-8-8 23:30 编辑

我找到错误了,错误在第11行,sp应该为偶数,至于为何要为偶数,我有如下猜想:
当sp为奇数时无法对齐栈底 所以系统在检查之后发现错误所以退出我用几组数据尝试了一下,都是奇数运行到此自动退出,而偶数能继续运行
但我没有其他的论据支持了,希望其他的高手能够给出一个更合理的解释

parbbo 发表于 2011-8-8 23:37:17

你这个代码是乱写,循环8次,栈却只有6个位置,哪剩下的2个去哪了?

NWm 发表于 2011-8-8 23:38:14

我又进行了进一步的探索,我发现当sp取9以下(包括9)的奇数时会出现这种情况,而当sp取一个大的奇数的时候程序并不会自动终止,这让我又有了一个猜想:
可能是在debug程序中调试我们编写的程序时要用到堆栈,而太短的奇数的堆栈导致堆栈溢出而不平衡从而引发致命异常从而导致程序崩溃

parbbo 发表于 2011-8-8 23:47:25

这个和sp一点关心都没有,因为还没调到sp设置就跳出

parbbo 发表于 2011-8-9 00:04:39

实验显示sp不能为奇数,因为栈都是以2位的形式递减

死亡请帖 发表于 2011-8-9 13:02:24

应该是mov sp, 14吧

583413088 发表于 2011-8-9 13:08:00

那实验5的代码该怎么写啊   谁能让我参考下

583413088 发表于 2011-8-9 13:54:59

好吧我非常承认 我错了   不过这次 看看这个代码怎么样啊assume cs:code
a segment
        dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
        dw 0,0,0,0,0,0,0,0
b ends
code segment
start:mov ax, b
      mov ss, ax
          mov sp, 22
          mov ax, a
          mov ds, ax
          
          mov bx, 0
          mov cx, 8
       s: push
          add bx, 2
          loop s
mov ax, 4c00h
int 21h
code ends
end start

parbbo 发表于 2011-8-9 14:11:51

你似乎不会使用栈,sp总是在乱指。你还是仔细研究研究吧!

583413088 发表于 2011-8-9 14:21:30

嘿嘿体谅下我是新手劳烦说下栈那里不对啊

parbbo 发表于 2011-8-9 14:24:44

你b标识号作为栈段,你定义了8个双字节数,哪你有多少个栈帧?空栈时栈顶应该在哪偏移呢?

583413088 发表于 2011-8-9 20:34:47

你这一番话我几乎看不懂 唉    学习啊:(
页: [1]
查看完整版本: 各位看看 这个代码 咋回事???