说清汇编中的栈操作地址问题

  文章其实很简单在这里只是想给大家个提醒让大家回顾下曾经知识而已大学知识现在你还记得么?

  另外善意提醒下博客园团队(Team)虽然我理解商业重要性但是我个人还是希望把培训学校广告撤下博客园首页广告行列中我相信博客园是个纯洁技术博客大家对博客园都非常信任我们不希望让太多初学者受到这个影响个人意见而已

  我刚才做个小软件Software破解直被堆栈操作弄得昏昏沉沉在这里写下也算是加深下自己印象做个整理总结也希望能够提醒到大家

  步入正题说说汇编中栈操作

  首先我们先来了解下汇编中和栈有关概念

  1. ss:  堆栈段 stack segment

  2. sp: 栈指针 stack po

  3. pop: 出栈

  4. push: 压栈

  相信各位对这些都很清楚不过了这里我从道很简单题把这个问题说清楚:

  用push指令(pop指令)把 a 段中前 8 个字型数据顺序存储到 b 段中

  让我们先写最简单框架:

 1assume cs:codeseg
 2   
 3    a segment
 4        dw 1,2,3,4,5,6,7,8,9,0aH,0bH,0cH,0dH,0eH,0fH
 5    a ends
 6   
 7    b segment
 8        dw 0,0,0,0,0,0,0,0
 9    b ends
10   
11    codeseg segment
12        start:
13        ---------------------------------
14
15        ---------------------------------           
16
17    codeseg ends
18
19end start
20
 


  我们需要做是补充start内部内容

  首先我们要搞清些基本东西:

  1.  在压栈时发生了什么:首先把栈指针sp - 1 , 然后放入高位数据然后sp – 1, 然后放入低位数据 简单了说也就是先把sp-2,然后取出数据

  2.  在出栈时发生了什么:首先取出第个字节数据即低位数据然后sp + 1 , 然后取出高位数据sp + 1然后高位数据和低位数据组合简单了说也就是先压入个字数据然后把sp+2

  那么好我们想上面我们再进步地写出来:

 1assume cs:codeseg
 2    a segment
 3        dw 1,2,3,4,5,6,7,8,9,0aH,0bH,0cH,0dH,0eH,0fH
 4    a ends
 5    b segment
 6        dw 0,0,0,0,0,0,0,0
 7    b ends
 8    codeseg segment
 9        start:
10            mov ax,b
11            mov ss,ax
12            mov sp,_______
13            mov ax,a
14            mov es,ax
15            mov bx,_______
16            mov cx,8H
17            loop1:
18                push es:[bx]
19                sub bx,2
20            loop loop1
21            mov ax,4c00H
22            21H
23    codeseg ends
24end start  


  上面两处横线位置我们究竟该如何去填

  思路很简单就是把b段作为个堆栈段然后把其他值压入

  那么就让我们考虑下sp 这个堆栈段指针究竟该为多少我们步是要把个字型数据压入到第 8个word当中那么sp应该指向第 9个数字所在地址处也就是(9-1)*2=16=10H地址处他压栈时候需要操作首先是把10H-2=0EH这个0EH指向则正是第 8个word

  接下来看第 2个空我们要把a段中第 8个 word压入栈中这个时候很简单我们这个bx应该是第 8个word地址也就是(8-1)*2=14=0EH

  为什么同样是第 8个数个是0EH个是10H区别就是栈操作时是先减后压

  这样我们补全上面:

 1assume cs:codeseg
 2    a segment
 3        dw 1,2,3,4,5,6,7,8,9,0aH,0bH,0cH,0dH,0eH,0fH
 4    a ends
 5   
 6    b segment
 7        dw 0,0,0,0,0,0,0,0
 8    b ends
 9   
10    codeseg segment
11   
12        start:
13            mov ax,b
14            mov ss,ax
15            mov sp,10H
16           
17            mov ax,a
18            mov es,ax
19            mov bx,000EH
20            mov cx,8H
21           
22            loop1:
23                push es:[bx]
24                sub bx,2
25            loop loop1
26           
27            mov ax,4c00H
28            21H
29           
30    codeseg ends
31end start  






  测试结果如下:



  图片看不清楚?请点击这里查看原图(大图)

  对于pop操作依然是同样道理大家感兴趣也可以自己试





Tags: 

延伸阅读

最新评论

发表评论