谁能给我解一下惑呢,大神出来吧
汇编吧
全部回复
仅看楼主
level 3
dyplm123 楼主
assume cs:code
code segment
dw 1234h,2345h,3456h,4567h,5678h,6789h,789Ah,89ABh
dw 0,0,0,0,0,0,0,0
start:
mov ax,cs
mov ss,ax
mov sp,30h
mov bx,0
mov cx,8
s:
push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0:
pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
这段代码是汇编语言第二版上的,实现的功能是把8个字型数据逆序放,程序开头申请了32个字节的内存用来放数据,我的问题就是,它的目的是让第二段16字节的内存成为栈,在初始化SS:SP的时候,我觉得SP应该是0021H,但为什么它是30H,是我理解错吗
2015年03月28日 07点03分 1
level 3
dyplm123 楼主
错了,是指向0020H,不是21H我是这样认为的
2015年03月28日 07点03分 2
我觉得也应该是20h,30就占领了代码段了
2015年03月29日 02点03分
level 1
栈顶应该是20h吧?出版印错了?而且这里栈不应该只设8Byte吧?我菜鸟也不懂...
2015年03月28日 07点03分 3
我也觉得应该是20h,后来看课后题有道差不多,给的答案又是20h,应该是错了
2015年03月28日 07点03分
@dyplm123 写错了额,不应该只设8Word吧?
2015年03月28日 08点03分
@arrooc 为什么不是,16字节啊
2015年03月28日 08点03分
level 10
嗯~,你看下代码段开始位置。mov ax,cs;
mov ss,ax;把栈设置在代码段;
mov sp,30h;前面两个dw已经占用了20h,后面10h用作栈。不过会覆盖代码。
2015年03月28日 09点03分 4
但我觉得不是这样的,像这样代码和数据没分开的,这样写出来之后,代码段的开始就应该是接着上面的数据的,如果它让sp指向30h,那么不就是指向某一段代码了吗,我学的不深,不对的地反个,请大神指点哈,嘻嘻
2015年03月28日 10点03分
回复 dyplm123 :不是大神。代码段开始位置不是子程序的覆盖也没关系,只要不影响程序运行。换个角度来看还可以节约内存,或者书上这样写就是要你理解这点[勉强],多角度思考。
2015年03月28日 10点03分
回复
��������
:有点难理解,等我学深一点再看看啦,谢谢啦
2015年03月29日 00点03分
level 6
push执行的时候前面的代码已经执行了,所占用的空间没用了,所以不会覆盖。不过最好自己定义ss
2015年03月30日 07点03分 5
有道理啊[呵呵]
2015年03月30日 13点03分
1