主题:栈的一个小问题
我是一名汇编新手,目前在看的是王爽的汇编语言,在他的一个例子中,我遇到个问题
原例:
完成下例程序,得用栈,将程序定义的数据逆序存入,
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
?
codesg ends
end
他给出的代码:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0
start:
mov ax,cs
mov ss,ax ;将栈的段地址指向程序入口段地址
mov sp,30h ;设置偏移地址,此时栈顶地址应是 ss:0030
mov bx,0
mov cx,8
s:
push cs:[bx] ;取出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
codesg ends
end start
按着题意,运行后内存的数据应为
cs:0000 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09
cs:0010 87 09 bc 0c ed 0f ef 0d bc 0a 89 07 56 04 23 01
我照着例子,分析他的代码,第一个dw定义的数据地址应在 cs:0000 - cs:000F
第二个dw定义的数据应在 cs:0010 - cs:0001F
程序入口在cs:0020,SS:IP 应在 cs:0030,从逻辑上他的代码貌似就实现不了,
我自己也写了一段代码,能复制前面几个数据,后面就冒出奇怪的数据,
望高人解答,是我理解错了,还是这段代码达不到这个意思...
原例:
完成下例程序,得用栈,将程序定义的数据逆序存入,
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
?
codesg ends
end
他给出的代码:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0
start:
mov ax,cs
mov ss,ax ;将栈的段地址指向程序入口段地址
mov sp,30h ;设置偏移地址,此时栈顶地址应是 ss:0030
mov bx,0
mov cx,8
s:
push cs:[bx] ;取出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
codesg ends
end start
按着题意,运行后内存的数据应为
cs:0000 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09
cs:0010 87 09 bc 0c ed 0f ef 0d bc 0a 89 07 56 04 23 01
我照着例子,分析他的代码,第一个dw定义的数据地址应在 cs:0000 - cs:000F
第二个dw定义的数据应在 cs:0010 - cs:0001F
程序入口在cs:0020,SS:IP 应在 cs:0030,从逻辑上他的代码貌似就实现不了,
我自己也写了一段代码,能复制前面几个数据,后面就冒出奇怪的数据,
望高人解答,是我理解错了,还是这段代码达不到这个意思...