另外善意提醒下博客园团队(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操作依然是同样道理大家感兴趣也可以自己试下
最新评论