汇编教程3-升级的准备

原创 2004年07月08日 14:14:00

汇编教程3-升级的准备
  经过了前面2篇教程的学习,我向大家应该对汇编程序有了比较深刻的影响了吧?所以不能教扫盲帖了,可以升级了,不过,在升级前,不免的对一些基础的东西要了解一下。
一、 CPU的内部寄存器:
4个16位的通用寄存器:
_____________________________
|__ah________|____al_________|  ax   
|__bh________|____bl_________|  bx
|__ch________|____cl_________| cx 
|__dh________|____dl_________| dx
  
其中:一般来说,ax用作乘除法中的累加器,bx可存放地址,也可作指针寄存器。
cx可存放循环次数,dx可存放I/O号。
ah为两个4位,al为两个4位,所以,ax为16位,其余的以此类推


4个16位的指针寄存器
______________________________
|bp基址指针
|_____________________________
|sp堆栈指针   用于做堆栈顶端指针
|_____________________________
|si源变址寄存器  
|________________这两个有时用来做变址器,存放数据以及运算结果
|di目标寄存器
|_____________________________


4个16位的内部寄存器:

______________________________
|cs:代码段寄存器
|_____________________________
|ds:数据段寄存器
|_____________________________
|es:附加段寄存器
|_____________________________
|ss:堆栈段寄存器
|_____________________________

标志寄存器:

____________________________
            ip指令指针     |
___________________________|
   flagsh    |  flagsl     |
_____________|_____________|状态标志
16位的标志寄存器,只用了其中的9个标志位,6各状态标志位,3个控制标志位。

fh:
________________
   |of|df|if|tf|   
___|__|__|__|__|

fl:
___________________________
|sf|zf|空 |af|空 |pf|空|cf|
|__|__|_  |__|_  |__|__|__|

具体的每个标志位的意思我简单的讲一下,如果要编程还要自己看一下书
cf:进位标志,进位/借位的时候cf=1
pf:奇偶标志,当指令执行结果的低8位中含有偶数个1时,pf=1,f否则为0
af:辅助进位标志,加减法的结果的低字节向高4位有进/借位时af=1.
zf:0标志。运算结果为0时,zf=1
sf:符号标志,他和运算结果的最高位相同。负数为1,正数为1
of:溢出标志,补码运算有溢出时为1
上面是状态标志,下面是控制标志:
df:方向标志,控制数据串操作指令的步进方向
if:中断允许标志
tf:跟踪标志,为调试程序而设置的,喜欢破解的人要特别注意这个

 

二、寻址方式:
  这个东西非讲不可,没办法,理解起来有困难,我尽量说清楚把!
 
  1、固定寻址
  这种方式,操作数隐藏在指令中,例如,daa,操作数隐含在al中

  2、立即寻址
  用来表示常数,例如:
  mov ax,9    ;9为立即数
  mov ax 1234h ;1234h为立即数,

  3、寄存器寻址
  例如:mov ax,cx
  执行前ax=9602h,cx=2081h
  执行后ax=2081h.

  4、存储器寻址
  这种方式下,操作数一般是代码段之外的数据段、堆栈段,附加段中的存储单元,指令给出的存储单元的地址或表达式。一般而言,一条指令的目的操作数和原操作数不能同为存储器操作数。存储器寻址又分为5种:

  直接寻址:操作数的有效地址由指令直接给出,是带有方括号的常量或变量。        物理地址pa=16*(ds)+偏移地址nn
  例如:
  mov al,[1000h] 将ds段的1000h单元的内容传到al,注意方括号和不加方括号的区别。

   mov ax,[1000h]
   将ds段的1000h内容传到ax,注意ah,al的内容。另外,不要忽视物理地址,这是很总要的信息,破解还是编程,都必须考虑到这个东西。
  
   mov al,es:[2000h] 表示将es段的2000h内容传到al,这叫段超越前缀。


寄存器间接寻址:
格式:[bx,bp,si或di].地址由基址寄存器或变址寄存器给出
如果指令中使用的是bx,si,di则用ds作为段地址
pa=16*(ds)+(bx/si/di)
例如:mov al,[bx] 设bx的内容为1000h,则把ds段的1000h的内容传到al
如果用bp,则用ss做段地址
pa=16*(ss)+(bp)
这种寻址方式一般用来对一维数组操作,改变bx等寄存器的值就可以对连续的存储器单元操作。

以后的就有点复杂了,注意看了,

基址寻址:
格式:偏移量[bx或bp]
例如:mov al,80h[bp] 设bp内容=2040h,则将堆栈段的20c0单元的内容传到al
为什么?因为在16进制下2040h+80h=20c0h不信可以到windows计算器中试一试。其实这条语句等同于mov al,[80h+bp]
操作数的有效地址ea=(bx)/(bp)+偏移量


变址寻址
格式:偏移量[si或di]
操作数的有效地址ea=(si)/(di)+偏移量
是不是和上面差不多?
我们来看一个操作数组的例子:
mov ax,array1[si]
mov array2[di],ax
懂了么? 为什么不能mov array2[di] array1[si]? 因为两个操作数不能同为变量。

别急,这里我没有给出这两种方式的物理地址,算是给大家的一个题目,很容易的,想想看!

 

基址变址寻址
其实就是上面两个结合起来
格式:偏移量[bx/bp + si/di]
pa=16*ds+(bx/bp + si/di  +偏移量)
或者16*ss+(bx/bp + si/di  +偏移量)
注意bx和bp选择的不同,段地址会不同,前者用ds,后者用ss

好了,就这么多,看着是有些头痛,有什么不懂就回帖问我吧,本来是要画图的,我偷了懒。
初学者慢慢看,多看几次,别想一次看懂,有信心就可以了!下一章我们讲循环语句,好了,睡觉去了,说不定明天要点名了。

Linux 下汇编学习

#Linux下汇编学习 在Ubuntu下用学习汇编语言编程,在使用ld链接时有碰到ld: i386 architecture of input file `eatsyscall.o’ is inc...
  • u010540535
  • u010540535
  • 2017年04月03日 22:03
  • 351

ARM汇编初始化C程序运行环境

ARM映像文件简介 1.ARM映像文件       ARM中的各种源文件(包括汇编文件,C语言程序及C++程序等)经过ARM编译器编译后生成ELF格式的目标文件。这些目标文件和相应的C/C++运行...
  • yiyi__baby
  • yiyi__baby
  • 2015年05月05日 18:51
  • 1158

Win32汇编基础教程

Win32汇编教程之一Win32汇编的环境和基础1.32位环境简介  在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表...
  • t0nsha
  • t0nsha
  • 2008年03月27日 16:38
  • 2444

SAP升级项目终于立项了,如何着手准备?

随着IT界软硬件的不断升级,以及企业自身业务对于ERP软件功能需求的不断增加,SAP ERP系统即使在上线以后,也不可避免的要考虑和应对系统升级或者更新的需求。 然而在升级项目立项之后,...
  • lively1982
  • lively1982
  • 2015年10月27日 14:32
  • 1139

超酷汇编教程-- 简明x86汇编语言教程(6)

4.0 利用子程序与中断 已经掌握了汇编语言?没错,你现在已经可以去破译别人代码中的秘密。然而,我们还有一件重要的东西没有提到,那就是自程序和中断。这两件东西是如此的重要,以至于你的程序几乎不可能离...
  • HelloApk
  • HelloApk
  • 2013年02月27日 11:40
  • 730

免杀汇编教程(汇编花指令)

相信很多朋友都做过木马免杀,早期的免杀都是加壳和改特征码,现在免杀技术已经发展到花指令免杀,改壳之类的,而这些需要一定的汇编知识,但是汇编却不是一块容易啃的骨头,所以我写了这篇菜鸟版的免杀汇编教程,帮...
  • zacklin
  • zacklin
  • 2012年03月27日 17:42
  • 1237

【LintCode】 Reverse Linked List 翻转链表

翻转一个链表样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null挑战 在原地一次翻转完成思路: 1、建一个新的头指针,将旧链表从头向尾拆卸,拆下来的节点插入...
  • wutingyehe
  • wutingyehe
  • 2015年07月14日 22:10
  • 606

搞了一下午 WIN32的汇编环境终于整好了

不容易啊,设置环境变量把偶弄得有点晕 不果还是设置好了偶使用MASM32 8.0中的LIB INCKUDE  BIN 这三个文件 采用NMAKE编译连接  编译器就是用EDITPLUS2 整好了 哈哈...
  • navyblue1982
  • navyblue1982
  • 2005年06月19日 20:21
  • 1921

入门级ARM汇编指令

无论是体系结构还是指令集,大家或多或少都应该对X86汇编有些了解,而对于嵌入式领域已被广泛采用的ARM 处理器,了解的可能并不多。如果你有兴趣从事嵌入式方面的开发,那么了解一些RISC 体系结构和AR...
  • ssdsafsdsd
  • ssdsafsdsd
  • 2013年03月18日 10:46
  • 3731

汇编里面的esp解释

最近在学加密解密,用od进行反汇编的时候,又重新对汇编了解研究了一下。。特别是对esp做了一个深入的研究。。下面是网上搜索到的。先记在这边看看。。       在寄存器里面有很多寄存器虽然他们的功能和...
  • ccboby
  • ccboby
  • 2010年11月12日 19:43
  • 1988
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编教程3-升级的准备
举报原因:
原因补充:

(最多只允许输入30个字)