关于代码段中使用栈的问题?
//下面程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据传送用栈来进行。。。//assume cs:codecode segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,24h
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push
pop cs:
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start// 什么意思啊??看不懂 啊 ....那位鱼友 能细讲一下 啊???????关于入栈和出栈数据在哪存放问题????、、???是怎么替换数据的 》?本来的0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
这些数据是在哪存放的?栈怎么能替换这些数据?push [bx】入栈是讲0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h这些数据存放在16~35的栈中吗?出栈怎么实现数据的替换呢???????
{:5_109:}我来试着回答下啊:
咱们一句一句来解释啊:
assume cs:codesg// 这里就是一句伪指令,就是告知编译器,下面的语句是要在cs这个段中执行,并且起个名字为(codesg),当然了名字尅有随便起,也可以叫abc,或则个def
codesg segment // codesg 段的开始
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h // 表示把这些字型数据分别存放在,以cs为段地址0为偏移地址的当前的段中,因为在程序第一句话就说明了下面的语句将要在cs段中执行!dw是定义字型的意思,define(定义) word(字型),dw写在前面就表明了它后面的数据是字型数据
dw 0,0,0,0,0,0,0,0,0,0// 这里是在上一句话结束后,紧跟着后面预留出来的一段20个字节的空间准备作为栈来使用,先预留出来
start: //源程序入口
mov ax,cs
mov ss,ax// 这两句是利用ax作为中介,把cs这个段地址赋值给ss,ss是栈段的段地址,也就是说下面的栈操作就要在cs段中执行了,好,先不要疑问,请往下面看
mov sp,24h // 这里是给栈段的偏移地址赋值为24h,因为程序开始的时候已经在cs段中写入了8个字型数据(一个字型数据等于2个字节),而且下面有预留了10个字形数据,这样我们不难算数一共是8*2+10*2=36 ,所以最后一个字节的地址是cs:35(因为我们存储数据是从0开始的所以最后一个字节的地址是35而不是36),也就是dw 0,0,0,0,0.... 的最后一个0的地址,因为1个字形数据存放的方式是高低字节的方式,所以最后一个地址是高字节位,由于现在这个栈暂时为空,栈顶所指向的位置就应该是最后一个字节的再下一位,所以就指向35后面的再下一位36,注意36是10进制的,这里我们可以转换为24H 这个16进制来进行编程
mov ax,0
mov ds,ax // 再次通过ax赋值给代码段ds段地址,因为题目中提出,内存0:0~0:15单元中的内容,也就是计算机内存中以ds为代码然后以0~15为偏移地址之间的这16个字节的数据,所谓的改写程序中的数据的意思就是用ds数据段中这16个字节的内容,改变我们程序最开始,在cs段中写入的
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 这段数据
mov bx,0 // 设置bx值为0
mov cx,8 //设置循环次数为8
s: // 定义循环标记
push // 因为如果以bx为偏移地址的话,就是默认了以ds为段地址,这句话的意思就是将以ds为段地址,bx的值0为偏移地址的数据,压栈到以ss(在前面我们已经设置了csj就是ss的段地址)为段地址,sp(24H)为偏移地址的地方去,总体说就是 ds:0的数据压栈道ss:24h中去,也就是压到了
dw 0,0,0,0,0,0,0,0,0,0 的最后一个0这个地方去
pop cs: // 好,上面我们已经把内存中的一个字的数据压到了栈中,现在我们要出栈了,出到哪里呢,当然依照题目的意思,我们要用栈中现在这个数据去改变程序最开始
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
的值, pop出栈到,以cs为段地址,bx的值0为偏移地址的地方,也就是0123h这个地方,这样就实现了内存中的数据区改变程序中的数据的
add bx,2 // 这里不用说了,bx增加2,因为一个字型数据等于2个字节,没执行一个覆盖数据就等于一定了2个字节的地址
loop s // 进入到下一个循环
下面的就不打了 都是结束语句了
不知道能不能帮到你
本帖最后由 hxs554f 于 2012-4-13 12:30 编辑
;由于不清楚代码要实现的功能,自能妄加揣测。自认为是将前面内存中的数据放入后面的内存中
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
;这些数据是存放在代码段的最前面
start: mov ax,cs
mov ss,ax
mov sp,24h ;数据放在代码段中,将cs的值传给ss,并设置好sp就可以对数据惊醒入栈出栈操作
; mov ax,0
mov ds,ax ;ds应该和cs相同吧
mov bx,0 ;ds:指向第一个数据
mov cx,8
s: push ;
pop ;将数据放到 dw 0,0,0,0,0,0,0,0,0,0 中
;pop cs:
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start hxs554f 发表于 2012-4-13 12:20 static/image/common/back.gif
;由于不清楚代码要实现的功能,自能妄加揣测。自认为是将前面内存中的数据放入后面的内存中
assume cs:co ...
次用内存0:0~0:15单元中的内容改写程序中的数据什么意思? hxs554f 发表于 2012-4-13 12:20 static/image/common/back.gif
;由于不清楚代码要实现的功能,自能妄加揣测。自认为是将前面内存中的数据放入后面的内存中
assume cs:co ...
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: mov ax,
mov cs:,ax
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end
这是第二种做法.... hxs554f 发表于 2012-4-13 12:20 static/image/common/back.gif
;由于不清楚代码要实现的功能,自能妄加揣测。自认为是将前面内存中的数据放入后面的内存中
assume cs:co ...
我感觉是内存中原有的数据把dw的数据给覆盖 芊芊 发表于 2012-4-13 12:47 static/image/common/back.gif
assume cs:code
code segment
哦,是将0:0~0:15中的数据覆盖掉cs段首的数据 hxs554f 发表于 2012-4-13 13:14 static/image/common/back.gif
哦,是将0:0~0:15中的数据覆盖掉cs段首的数据
恩恩 我是按照dw从0~15 第二个dw16~35 35+1 这样求栈顶的那默认不是吧程序的数据从内存0开始计算了?内存中0~15的数据不是程序dw的数据了吗 芊芊 发表于 2012-4-13 13:18 static/image/common/back.gif
恩恩 我是按照dw从0~15 第二个dw16~35 35+1 这样求栈顶的那默认不是吧程序的数据从内存0开始计算了? ...
你在循环结构中push后面就接着pop,栈顶指针指向的位置实际上没变。
内存0:0中数据并不是dw中的数据,cs:0中才是dw的数据 梦想与现实 发表于 2012-4-13 11:28 static/image/common/back.gif
我来试着回答下啊:
咱们一句一句来解释啊:
assume cs:codesg// 这里就是一句伪指令,就是告 ...
人才啊 这位哥哥~~~求企鹅号~~~{:7_169:} hxs554f 发表于 2012-4-13 13:36 static/image/common/back.gif
你在循环结构中push后面就接着pop,栈顶指针指向的位置实际上没变。
内存0:0中数据并不是dw中的数据,cs: ...
恩恩~~~cs:0中才是dw的数据我理解错了 梦想与现实 发表于 2012-4-13 11:28 static/image/common/back.gif
我来试着回答下啊:
咱们一句一句来解释啊:
assume cs:codesg// 这里就是一句伪指令,就是告 ...
是这意思吧我理解对不
页:
[1]