汇编知识

汇编指令:

Push是四个字节对齐的,因此每次压入四个字节。

_asm关键字用于调用内联汇编程序,并且可以在c/c++语句中出现。它不能单独出现,必须后接汇编指令。如果其后面不接大括号,那么表示这行的其余部分是一条汇编语句。

lea  eax,shellcode

:向eax中加入有效地址。

Xor

,表示异或。Xor ebx,ebx    将ebx的值清0.

cmp

(compare):比较指令,实际上时根据第一个数减去第二个数对标志寄存器的影响决定的。http://www.oicqzone.com/pc/2013020414917.html

jne

(jump  if equal):汇编语言中的条件转移指令,结果为0(不相等)则转移。

lodsd/lodsw、Stosb/STOSW

汇编语言中,串操作指令lodsd/lodsw是块读出指令,其具体操作是把SI指向的存储单元读入累加器。Lodsb是读入al中,lodsw是读入ax中,然后si自动增加或减少1或2位。当标志位df=0时,则si自动增加,df=1时,则si自动减少。

Stosb/STOSW也是块写入指令,其具体操作是把累加器的内容写入到存储单元中,其中STOSB是从AL中读入,STOSW是从AX读入,然后si自动增加或减少1或2位,当方向DF=0时,则SI自动增加,当SI=1时,则SI自动减少。

Pushad

,汇编的传送指令之一,与它相关的还有PUSHA,POPA/POPAD,他们配合使用用于8个16位/32位通用寄存器之间的数据传送。PUSHAD指令压入32位寄存器,其入栈顺序是EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI.(相当于多个push)

Inc(a):a:=a+1。

Cdq

(convent  double to  quad):这个指令将EAX(32位)变为EDX:EAX形式(64位),这样一变之后EDX就充当了符号位,如果其为正数,edx 置 0(00000000);如果其为负数,edx 置 -1(FFFFFFFF) ;这样,指令后的 edx:eax 形成的一个 qword 数,就和原来的 eax 这么个 dword 的值相等;这个指令通常用在应付后续的 div dword 指令上。(本来EAX中既可以是正数,也可以是负数)(很久前  指令集规定除数必须是被除数的一半长,就一直沿用下来。IDIV有符号除法指令, 除数是32位,那么被除数需要64位,然后就用EDX来扩展EAX的符号位,这样既不改变EAX的值 又扩展成64位)

Movsx

,带符号位传送。

Jz

,jump   if zero。

Ror

,循环右移,并补位。

Popad

与pushad互逆,依次弹出EDI,ESI,EBP,ESP,EBX,EDX,EAX.

对汇编一些知识的理解

物理地址=段地址+偏移地址??:

一开始没学这个的时候,我认为内存分为好多段,段里再细分地址。其实,内存里并没有什么分区分段,这里的  物理地址=段地址+偏移地址   实际上是因为CPU的结构位数小于地址总线的位数,CPU为了能指示出所有的内存地址而弄出的一种表示方法。

(例如在8086CPU中,地址总线为20位,可以寻1M地址,但CPU的位数只有16位)

可以将这里的地址比喻为梯子,一个梯子只有16米长,到达不了20米高的地方,但是我们可以在这个梯子的基础上再加一个16米的梯子,这样我们就可以到达20米高的地方了。

Debug的使用

在xp及以下的系统中,可以用debug来查看以及更改寄存器和内存的数据。

R,查看,改变寄存器的内容

D,查看内存的内容

E,改写内存的内容

T,执行一条机器语句(执行CS:IP指向的内存中的指令)

CPU根据什么来辨别内存中是数据还是指令

我们在看0day时知道,指令即数据,数据即指令,那么是什么将数据和指令分开呢?CPU将CS:IP指向的内存中的数据看做指令,如果一条指令被执行,那么它所在的内存一定被CS:IP指向过。与此相对应的,CS:IP没有指向的内存里存的就是数据了。

CPU如何动态地确定指令的大小从而确定CS:IP的变化?

CPU中有编译器,先将IP寄存器指向的机器码编译为汇编代码,判断其是否为一个完整的汇编语句,若是,则将这条语句的信息反馈给寄存器,IP寄存器地址变化;若不是,则继续读取下一内存的机器码编译,判断,直至找到完整的汇编代码。

段寄存器不能用于算术运算的指令中(段寄存器与通用寄存器的结构不同)

http://jpkc.nwpu.edu.cn/jp2007/05/dzjc/text/chapter2/section2/text1r.htm

段寄存器是用于段寻址用的,而程序之间有段保护。这个段保护使得一个程序的崩溃不会影响到其他程序。
又由于段寄存器是用来当前正在运行的进程获得它的段寻址用的,所以一定不能乱变。
CS,DS,SS等所有和段相关的寄存器都不能不能用来计算。

汇编中,寄存器,内存单元,段寄存器之间的数据可以相互加载。

在某些CPU中(如8086CPU),不支持将数据直接送入段寄存器的操作。

时间: 2024-10-26 12:30:56

汇编知识的相关文章

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写 一丶内存寻址模型 逻辑地址.线程地址.物理地址 了解汇编之前.先了解一下上面这些词的含义; 逻辑地址: 这个是邮编一起生成的.逻辑地址一般都是 段加段内偏移组成的.每个进程独享. 线性地址: 由分段管理机制.将逻辑地址转化为线性地址.这个了解即可.学过内核的人看到应该明白.如果没有学过.简单滤过即可(32位下逻辑 = 线性) 物理地址: 通过分页管理机制(内核中成为PDE PTE等页目录 页表等等)将线性地址转化为物理地址. 这些了

汇编知识相关

1.汇编Lea 指令与 Mov 指令 转:http://www.cnitblog.com/textbox/articles/51912.html 比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:     push   ebp     mov   esp,   ebp     sub   esp,   4     现在栈上就有了4各字节的空间,这就是你的局部变量.     接下来,你执行mov   LocalVar,   4,那么实际

汇编知识准备0x00

1.如何用汇编语言指令或伪指令调用Windows提供的API函数? 2.Windows汇编与DOS汇编的区别? 分段与特权指令 3.二进制数与八进制.十六进制.十进制的关系 D O/Q H B 4.容量单位 1024 = 400h = 2^10 = 1K 65536 = 10000h = 2^16 = 64K 2^20 / 2^30 / 2^32 = 4G 5.无符号数与有符号数的表示范围 有符号数与补码的关系 6.汇编的基本元素 汇编语言编译器(ML\MASM) 整数常量: 运算符及优先级:

汇编入门之输入、输出、奇偶判断、多字节变量定义

原创文章,转载请注明:汇编入门之输入.输入.奇偶判断.多字节变量定义 1.入门参考 首先介绍一个非常好的汇编知识的索引网站:经典汇编语言教程 1.1 MOV CX,[BX] 加方框的意思是说以BX中的数据为地址寻址,将寻址得到的数据放在CX中 1.2 16位寄存器组 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) 4个段寄存器(ES.CS.SS和DS) 1个指令指针寄存器(IP) 1个标志寄存器(Flags) 1.3 DB 定义字节变量

8080汇编指令大全

8080汇编手册数据传输指令 ────────────────────────────── 它们在存贮器和寄存器.寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,E

内核基础---AT&T汇编与x86汇编的区别

1.深入Linux内核的前提 因为以前学习过intel的x86汇编语言,所以本文就不在讲述汇编的基本语法了: 内核绝大部分的代码都是用C和汇编语言实现的,要理解内核,C语言大部分的人都已经掌握了,接下来就得首先掌握汇编知识,以便深入理解Linux内核知识!!! 2.学习Linux内核的线路 首先内核有基础部分和深入的部分,我认为应该从一个全局的角度去解读Linux内核,以便我们达到一个更加深刻的认识,从内核的整体架构--->内核源码的解读,并且在这个的过程中不断的去修改代码,编程调试是至关重要的

关于学习汇编的建议

如果是学生想学习汇编(ARM)的,还想学习游戏开发的,我建议可以用这样的方法:2014年 别踩白块儿这个游戏很火,是用cocos2d-x(C++)开发的,游戏本身比较简单.你可以对这个游戏进行逆向,然后复制出一个你自己的别踩白块儿.逆 向的方法是结合ida的汇编代码以及F5反编译出来的伪代码进行代码逆向,当然前提是对cocos2d-x的游戏开发的一些基本元素要了解,另一方 面,cocos2d-x本身是开源的,你可以在IDA中看到很多明显的api调用,这会减轻逆向的难度.感觉有以下几个好处:1)掌

Android漫游记(5)---ARM GCC 内联汇编烹饪书(附实例分析)

原文链接(点击打开链接) 关于本文档 GNU C编译器针对ARM RISC处理器,提供了内联汇编支持.利用这一非常酷炫的特性,我们可以用来优化软件代码中的关键部分,或者可以使用针对特定处理的汇编处理指令. 本文假定,你已经熟悉ARM汇编语言.本文不是一篇ARM汇编教程,也不是C语言教程. GCC汇编声明 让我们从一个简单的例子开始.下面的一条ARM汇编指令,你可以添加到C源码中. /* NOP example-空操作 */ asm("mov r0,r0"); 上面的指令,讲r0寄存器的

程序破解基本知识

程序破解基本知识 程式如何保护:     最通常是用你的name当作key,   经过复杂演算法,   算出注册码.但也有一些并不是用你的name当作key算注册码的,而是name与注册码无关,注册码是固定,name是随便输入就可以了.对于前者,较容易可算出注册码,而后者要算注册码就不是一件容易的事了.关于两者的具体处理方法,会在下面文章详细介绍.     注册处理:         1.   当输入name,   company,   password   後,   立即比对,   正确的话立