- [游客] 111111111111111113 04/09 01:55
- [tomato] 发现了一个错误。大家在看的时候不妨注意一下。 “2.5堆和栈中的存储内容 栈: 在函数调用时, 04/15 18:03
- [musicvs] 第一题我用一个笨方法算的: 第三条指令就是 10H+90H=A0H ,这里的16进制是补码,然 09/15 12:47
- [fontomas] 第二题已了。 如果寄存器不能保存cmp指令的逻辑结果(超范围),所以实际结果用补码表示。 是这样 08/27 17:03
- [fontomas] SF=1 ? 上面显示的不是 SF=PL吗? 原来“ NV UP EI PL NZ NA P 08/26 16:00
- [mouse] 11.12有debug的标志位显示和标志位的对应关系,可以体验查看一下^_^ 08/26 08:33
- [mouse] mul al zf=0 pf=1 sf=1 这章的答案都 08/26 08:32
- [starrynight] 我顶! 08/25 20:14
- [wuerlang] 嗯,要顶. 08/25 18:03
- [fontomas] 是啊,我本来也想用栈的,可是看到用push/pop那么多次,我就感到快要疯了,所以自作主张改了一下S 08/24 03:10
- [fontomas] 实验一下,Blog突然不能发表文章了! 08/11 21:07
[2008-08-19 08:29] 实验10.1-显示字符串
问题1:程序用Debug调试可以正常显示,但CMD下去什么都不显示(好像一闪而过),而在commmand.com下运行也可以正常显示。请问这是怎么回事?(不知道其他人是否也如此?)
PS. 175页实验9的程序可以正常显示。
问题2:程序中定义了SS段: dw 16 dup (0),但当sp取值 1AH 到 20H 时候,程序运行就会出错,请问这是怎么回事?
程序如下:
assume CS:CODESG, DS:DATASG, SS:STACKSG
STACKSG SEGMENT
dw 16 dup (0)
STACKSG ENDS
DATASG SEGMENT
db 'Welcome to Masm!', 0
DATASG ENDS
CODESG SEGMENT
start:
mov DH, 8 ;定义字符串显示位置:第8行
mov DL, 3 ;定义字符串显示位置:第3列
mov CL, 0CAH ;定义字符串显示颜色:红底高亮闪烁绿色
mov AX, DATASG
mov DS, AX
mov SI, 0H ;定位字符串首地址
call Show_str
mov AX, 4C00H
int 21H
Show_str:
;寄存器压栈,防止寄存器冲突
push SI
mov CH, 0H
push CX
mov AX, STACKSG
mov SS, AX
mov SP, 10H
;初始化显示缓冲区,并完成输出位置的计算
mov AX, 0B800H
mov ES, AX
mov DI, 0H ;定义屏幕字符显示宽度
;计算,并用BX来储存屏幕上所对应的M行N列的偏移地址的和
mov AL, 0A0H
mul DH
mov BX, AX
mov AL, 02H
mul DL
add BX, AX
mov AL, CL ;保存字符显示颜色
GetStart:
mov CL, [SI]
mov CH, 0H
jcxz Done
mov CH, AL
mov ES:[BX+DI], CX
add DI, 02H ;显示缓冲区中,一个字符占2个字节,所以BX应循环+2
inc SI
jmp SHORT GetStart
Done:
pop CX
pop SI
ret
CODESG ENDS
END start
[ younggay 发表于 2008-08-19 10:19 ]
程序用Debug调试可以正常显示,但CMD下去什么都不显示(好像一闪而过),而在commmand.com下运行也可以正常显示。请问这是怎么回事?(不知道其他人是否也如此?)
==========================
command才是windows提供的一个模拟dos的环境吧,cmd是命令解释作用的,好像不太一样。有些程序在cmd下会莫名其妙的,说不很清楚,所以,偶一直在command下做练习。
[ younggay 发表于 2008-08-19 10:32 ]
程序中定义了SS段: dw 16 dup (0),但当sp取值 1AH 到 20H 时候,程序运行就会出错,请问这是怎么回事?
=================
你定义的栈段在程序中好像没有起到任何作用吧。也没有用到你定义的栈段,而且,你的
mov AX, STACKSG
mov SS, AX
mov SP, 10H
使你的逻辑感觉混乱,如果后面还有其他子程序可能就会混乱了,因为你push的数据,pop还原的时候肯定不对了,因为push和pop操作的时候的栈段不一致,栈的地址都被你变了。
而你所说的sp为1AH到20H出错,首先,如果按照你的ss来计算,sp为上述值的时候,就指向了你的字符串数据空间了。至于如何运行到那里,如何出错的,我想debug一下自然会分析出来的。
先把你的逻辑上的错误给理清了,在找这个问题的症结吧。
[ 游客 发表于 2008-08-19 18:53 ]
谢谢了!原来是我自己没注意到,call后保存的IP是以整个64K作为SS段的,而我定义的SS只有32个字节。
但是还有问题:
1.此时SS中1A-20为什么不为0?我用Debug查看了一下,这一段空间里有数值填充。
2.如果将SP指向FFFEH,则程序不会出错,但这样做应该算是栈顶超界了吧?如果向栈中压入数据(程序中的push si,push cx),则有可能会产生不可预知的错误吧?
3.栈可以不用定义就直接使用吗?没有给栈遇险分配空间,那如果整个64k大小的段内都是代码,那执行call指令时岂不是会产生覆盖,这样做岂不是很不不安全?