首页
社区
课程
招聘
[旧帖] [原创]汇编语言的准备知识--给初次接触汇编者(1) 0.00雪花
发表于: 2010-5-31 06:18 4004

[旧帖] [原创]汇编语言的准备知识--给初次接触汇编者(1) 0.00雪花

2010-5-31 06:18
4004
汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)
  ============================
  x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.

  在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:

  1. 通用寄存器:
  EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)
  
  这些32位可以被用作多种用途,但每一个都有\"专长\". EAX 是\"累加器\"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是\"基地址\"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.
  
  ESI/EDI分别叫做\"源/目标索引寄存器\"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.   EBP是\"基址指针\"(BASE POINTER), 它最经常被用作高级语言函数调用的\"框架指针\"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:
  
  push ebp ;保存当前ebp
  mov ebp,esp ;EBP设为当前堆栈指针
  sub esp, xxx ;预留xxx字节给函数临时变量.
  ...
  
  这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.
  
  ESP 专门用作堆栈指针.
  
  2. 段寄存器:
  CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.
  DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符\"别名\"而通过DS来访问/修改. 自修改代码的程序常如此做.
  ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.
  SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.
  
  3. 标志寄存器(EFLAGS):
  该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:
  
  进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.
  零标志Z(ZERO), 若运算结果为0则置1, 否则为0
  符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.
  溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.
  
  JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的\"XX\" 有如下字母:
  
  无符号操作: 带符号操作:
  A = \"ABOVE\", 表示\"高于\" G = \"GREATER\", 表示\"大于\"
  B = \"BELOW\", 表示\"低于\" L = \"LESS\", 表示\"小于\"
  C = \"CARRY\", 表示\"进位\"或\"借位\" O = \"OVERFLOW\", 表示\"溢出\"
  S = \"SIGN\", 表示\"负\"
  通用符号:
  E = \"EQUAL\" 表示\"等于\", 等价于Z (ZERO)
  N = \"NOT\" 表示\"非\", 即标志没有置位. 如JNZ \"如果Z没有置位则跳转\"
  Z = \"ZERO\", 与E同.
  
  如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, ....
  
  4. 端口

  端口是直接和外部设备通讯的地方。外设接入系统后,系统就会把外设的数据接口映射到特定的端口地址空间,这样,从该端口读入数据就是从外设读入数据,而向外设写入数据就是向端口写入数据。当然这一切都必须遵循外设的工作方式。端口的地址空间与内存地址空间无关,系统总共提供对64K个8位端口的访问,编号0-65535. 相邻的8位端口可以组成成一个16位端口,相邻的16位端口可以组成一个32位端口。端口输入输出由指令IN,OUT,INS和OUTS实现,具体可参考汇编语言书籍。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主,我崇拜你,我会一直看下去的
2010-6-2 11:05
0
雪    币: 459
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好东西,得慢慢看。
2010-6-2 13:09
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了     楼主
2010-6-3 16:57
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呵呵不错喔!支持下!随便问下大家有唔爱破解网邀请码没有!有的话看雪邀请码换!换的QQ290856314
2010-6-3 18:04
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
难倒还有续集?
2010-6-3 19:01
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
删了 顶顶顶顶
2010-6-3 22:03
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
刚开始入门汇编,学习了
2010-6-4 10:10
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我也想学习汇编,看了……
2010-6-8 20:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
刚开始入门汇编  看了……
2010-6-9 21:35
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
该花时间学习了,
2010-6-20 22:08
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我开始学习了,我会努力下去的哦
2010-6-21 16:36
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵不错喔!支持下!
2010-6-22 16:40
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持了  顺便 问下  为什么 不支持看电子版的书 而要求买实体的书呢?
2010-6-22 17:53
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
还行,多多少少学了点。谢谢~~
2010-6-23 00:13
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢楼主,我看的中山大学的教程  刚好看到31集讲到i/o端口。。。刚好把我前面看的东西都总结了一次。。。

希望楼主能出续集。。。
2010-6-23 00:56
0
雪    币: 798
活跃值: (94)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习了,谢谢。。。
2010-6-23 01:07
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
等待续集
2010-6-23 09:46
0
雪    币: 98
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
该花时间学习了
2011-12-18 21:30
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
  我不禁想知道,人的一生,从十月怀胎到呱呱落地,从嗷嗷待哺到呀呀学语,从青春年少到耋耄之年,需要经历多少次挫折磨难才能茁壮成长?才归于平淡?
  这件事要从我大学毕业后说起,故事有点长,时间的跨度有点大,其中囊括包含了我那残缺不全支离破碎的初恋,和我惨不忍睹不堪回首的爱情历程。我不知道能不能持之以恒地将这些经历完整性地呈现出来,我的时间不多,耐性不够,但我会尽量忙中偷闲、见缝插针地将那些曾经的爱与恨,恩与怨敲打出来。当然,你可以看或不看,相信或质疑。这是一个故事,也是一部小说将夜更是人生经历。
2011-12-19 02:47
0
游客
登录 | 注册 方可回帖
返回
//