打印 上一主题 下一主题

[windows] 新手报到之汇编初体验

[复制链接]
跳转到指定楼层
楼主
3010 1 小黑豆share 发表于 2017-1-18 00:53:32
接触汇编之后觉得,尽管汇编很是舞曲,但却是很强大的一种语言,直接对内存进行操作,也是逆向工程的毕竟之路,学好了汇编,对于逆向工程的帮助也是显著的。
数据类型.
**************************************************************************************************
十进制                二进制                十六进制
0                0000                0
1                0001                1
2                0010                2               
3                0011                3       
4                0100                4
5                0101                5
6                0110                6
7                0111                7
8                1000                8
9                1001                9
10                1010                A
11                1011                B
12                1100                C
13                1101                D
14                1110                E
15                1111                F
16                1,0000                10
D               B               H
十进制的2  2D
二进制的2  0010B
十六进制2  2H
**************************************************************************************************
寄存器
**************************************************************************************************
1. 通用寄存器
  通用寄存器包括了8个16/32位的寄存器:AX/EAX、BX/EBX、CX/ECX、DX/EDX、SP/ESP、BP/EBP、DI/EDI及SI/ESI。其中AX/EAX、BX/EBX、CX/ECX、DX/EDX在一般情况下作为通用的数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。它们还可分为两个独立的8位寄存器使用,命名为AL、AH、BL、BH、CL、CH、DL和DH。这4个通用数据寄存器除通用功能外,还有如下专门用途:

  AX/EAX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。

  BX/EBX在计算存储器地址时,可作为基址寄存器使用。

  CX/ECX常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器。DX在作双字长运算时,可把DX和AX组合在一起存放一个双字长数,DX用来存放高16位数据。此外,对某些I/O操作,DX可用来存放I/O的端口地址。

  SP/ESP、BP/EBP、SI/ESI、DI/EDI四个16/32位寄存器可以象数据寄存器一样在运算过程中存放操作数,但它们只能以字(16/32位)为单位使用。此外,它们更经常的用途是在存储器寻址时,提供偏移地址。因此,它们可称为指针或变址寄存器。

  SP/ESP称为堆栈指针寄存器,用来指出栈顶的偏移地址。

  BP/EBP称为基址指针寄存器,在寻址时作为基地址寄存器使用,但它必须与堆栈段寄存器SS联用来确定堆栈段中的存储单元地址。


2、标志寄存器FLAG
条件码标志用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由(CPU)自动设置的。由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以称为条件码。
  ① 进位标志 CF,记录运算时最高有效位产生的进位值。
  ② 符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。
  ③ 零标志  ZF,运算结果为0时ZF位置1,否则置0。
  ④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。
  ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。
  ⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。
数据传送指令
**************************************************************************************************
1、传送指令MOV(move)
**************************************************************************************************
传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:
MOV  Reg/Mem, Reg/Mem/Imm
其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。
**************************************************************************************************
2、传送—填充指令
**************************************************************************************************
传送—填充指令是把位数短的源操作数传送给位数长的目的操作数。指令格式如下:
MOVSX/MOVZX  Reg/Mem, Reg/Mem/Imm     
其中:80386+表示80386及其之后的CPU,其它类似符号含义类同,不再说明。
指令的主要功能和限制与MOV指令类似,不同之处是:在传送时,对目的操作数的高位进行填充。根据其填充方式,又分为:符号填充和零填充。

符号填充指令MOVSX
MOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位

零填充指令MOVZX
MOVZX的填充方式是:恒用0来填充目的操作数的高位数据位

例如,AL=87H,指令MOVSX  CX, AL;MOVZX  DX, AL执行后,问CX和DX的值是什么?

根据传送-填充指令的填充方式可知:
指令MOVSX CX, AL执行后,(CX)=0FF87H,指令MOVZX DX, AL执行后,(DX)=0087H。


从上例可看出,两条指令的源操作数完全一样,但因为它们的填充方式不同,所得到的结果而就不同。
**************************************************************************************************
3、交换指令XCHG
**************************************************************************************************
交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同。其指令格式如下:
XCHG  Reg/Mem, Reg/Mem

例如,AX=5678H,BX=1234H,指令XCHG  AX, BX执行后,AX和BX的值是什么?

这是两个寄存器内容进行交换,指令执行后,有:(AX)=1234H,(BX)=5678H。
**************************************************************************************************
4、取有效地址指令LEA(Load)
**************************************************************************************************
指令LEA是把一个内存变量的有效地址送给指定的寄存器。其指令格式如下:
LEA Reg, Mem
**************************************************************************************************
5、取段寄存器指令
该组指令的功能是把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器(DS、ES、FS、GS和SS)。其指令格式如下:
LDS/LES/LFS/LGS/LSS Reg, Mem
**************************************************************************************************
6、堆栈操作指令
**************************************************************************************************
堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进/压栈操作和出/弹栈操作。

1)、进栈操作

、PUSH
指令格式:PUSH Reg/Mem
PUSH Imm          
一个字进栈,系统自动完成两步操作:SP←SP-2,(SP)←操作数;
一个双字进栈,系统自动完成两步操作:ESP←ESP-4,(ESP)←操作数。

、PUSHA
指令格式:PUSHA      
其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。

、PUSHAD
指令格式:PUSHAD      
其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。

2)、出栈操作
、POP
指令格式:POP Reg/Mem
弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP-2;
弹出一个双字,系统自动完成两步操作:操作数←(ESP),ESP←ESP-4。

、POPA
指令格式:POPA       
其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用就可以了。

、POPAD
指令格式:POPAD    
其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它与PUSHAD对称使用即可。
**************************************************************************************************




沙发
rodster 发表于 2017-1-18 12:54:37
666666666666666,继续加油!争取寒假脱胎换骨
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐阅读

Archiver|手机版|小黑屋| 云夕阁 ( 湘ICP备16017785号-2 )     

返回顶部 返回列表