吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3684|回复: 10
收起左侧

[其他转载] 关于汇编程序的解析

  [复制链接]
A学习的小菜鸟 发表于 2017-11-1 20:44
在王爽老师的汇编语言程序设计中,监测点10.5题的编程题有好多同学并不是会理解这些编程含义,今天,我给大家分析一下这个简单的程序
源程序:
mov ax,data  
mov ss,ax                     
mov sp,16                    
mov word ptr ss:[0],offset s  ;offset s
mov ss:[2],cs                 
call dword ptr ss:[0]      
nop                        
s:mov ax,offset s              
sub ax,ss:[0ch]                     
mov bx,cs                       
sub bx,ss:[0eh]
分析程序,为了使大家更加透彻,本人会尽力每一句进行分析:
            mov ax,data  
mov ss,ax                     ;这里数据段就作为栈段使用了。  
mov sp,16                     ;SS:SP=[data]:[10h]  
mov word ptr ss:[0],offset s  ;offset s 取标号S偏移地址存入内存单元ss:[0]
mov ss:[2],cs                 ;这里将段地址CS的值存入内存单元ss:[2]中,以上这两句就是确定了CALL
                                    执行时需要的地址CS:IP ,当CALL执行时转移到SS:[0],而此单元的内容
                                     正好是标号S的地址
call dword ptr ss:[0]       ;这里call执行时还是分两步,由于是双字转,移所以首先将CS的值压入栈顶中
                                       即ss:[0eH],将IP的值压入ss:[0cH](此处压入的IP值就是call临近的下一
                                       条指令nop处的偏移地址)      

nop                          ;由于call直接跳转到了标号s处,所以该指令没有被执行,但是占用一个字节,
                                  如果没有NOP指令,则call执行IP的压栈操作时压入的IP值就会是标号S的偏移
                                  地址,那时候结果ax就是0
s:mov ax,offset s               ;取标号S的偏移地址存入ax中  
sub ax,ss:[0ch]                ;ax=ax-ss:[0Ch]=001A-0019=1,AX中的内容是标号S的偏移地址,
                                         [0cH]单元的内容就是NOP指令的偏移地址 ,确实相差1
mov bx,cs                       
sub bx,ss:[0eh]                ;bx=bx-ss:[0eH]=0正是CALL执行时将CS的值压入到了ss:[0eH]  
其实可以给CS、标号S的偏移地址赋个值这样理解更直观。总之记住CALL执行时压入的IP的值就是它临近的下一条指令的偏移地址就行了。
你是不是对call执行时cs、ip入栈的地址有疑问?认为CS入栈的地址应该是SS:[4]而不是ss:[0eH]?我觉得可能call上面的这两条指令影响到你了
mov word ptr ss:[0],offset s
mov ss:[2],cs
开始的时候栈顶指针的位置在哪我觉得你应该知道,这里你要理解一下栈定指针和指令指针的区别,当我们用MOV指令将内容写入内存单元时,并不会影响到栈定指针的位置,因为我们的栈空间是来自一个数据段,程序向数据段中写内容而不是栈中写内容。如果我们的栈执行到ss:[0] 时也会覆盖原来的数据。所以虽然说栈内好像有了数据,但是栈顶指针位置并不受影响。剩下的就是好好理解一下栈的结构及工作方式。
他依然指向开始的位置,直到有PUSH指令才改变。
这次的程序就分析到这里了,如果帮助到你,还请给楼主点赞和爱心。
毕竟楼主打这么多字很辛苦的,给楼主点动力吧!!{:1_931:}

免费评分

参与人数 4吾爱币 +2 热心值 +4 收起 理由
兜兜里有枪 + 1 热心回复!
tohyueyun + 1 热心回复!
海天一色001 + 1 + 1 谢谢@Thanks!
无影寒冬 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yh0901 发表于 2017-11-1 20:58
膜拜下大神
hack0098 发表于 2017-11-1 21:02
newchange452pj 发表于 2017-11-1 21:50
深海未眠, 发表于 2017-11-1 21:54
谢谢楼主分享
zjbr 发表于 2017-11-16 14:27
还没学到那,但是先赞您,将来再请教
pengjiangyu 发表于 2018-3-16 12:26
膜拜大神
nice110 发表于 2018-8-20 13:53
大学学过,已经忘光光了
wxdjs 发表于 2018-8-20 19:25
真的佩服,早忘记了
tohyueyun 发表于 2018-8-23 03:17
谢谢菜鸟的分享呀~!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-5 05:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表