首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

一个令小弟我疑惑的地方

2013-01-25 
一个令我疑惑的地方,求助assume cs:code,ds:data,ss:stackdata segmentdw 0123h,4567hdata endsstack segm

一个令我疑惑的地方,求助
assume cs:code,ds:data,ss:stack
data segment 
     dw 0123h,4567h
data ends
stack segment
      dw 0h,0h
stack ends
code segment
start:mov ax,stack
     mov ss,ax
     mov bx,data
     mov ds,bx
     mov sp,10h
     mov bx,0
     
     mov cx,2
     flag:push ds:[bx]
         add bx,2
     loop flag
     
     mov cx,2
     flag0:pop ds:[bx]
          add bx,2
     loop flag0
     
     mov ax,4c00h
     int 21h
 code ends
 end start
sp为什么不是5h,栈里面不是4个字节大的空间吗,栈为空不就是mov sp,5h吗?
[解决办法]
应该是8字节吧,两个DW
[解决办法]
目的是利用栈空间交换数据段中的两数据的位置?mov sp,4,设置栈顶ss:sp指向stack:4。plag0前面还要bx清零
[解决办法]
你不能这样算,要预留空间,stack在这种情况下不是光你一个人用
[解决办法]
首先,sp的变化是以2为单位的,即每次要么加2、要么减2,所以sp的值不会是奇数。
其次,程序中定义的堆栈段只有两个字——4个字节的空间,而8086的分段概念中最小的段是16字节,所以,最终该程序实际的分配的堆栈段是16B(因为有效的段地址都是16的倍数,即****0H),即使后面的空间你用不到。因此,程序中“MOV SP,10h”,设定栈的深度为16B。

热点排行