【Assembly】-NO.88.Assembly.2.滴水逆向.1.002-【位运算及基础指令】-

  1.0.0 Summary

Tittle:【Assembly】-NO.88.Assembly.2.滴水逆向.1.002-【】-

Style:Java

Series:Log4j

Since:2018-02-09

End:2018-02-09

Total Hours:30+

Degree Of Diffculty:5

Degree Of Mastery:5

Practical Level:5

Desired Goal:5

Archieve Goal:3

Gerneral Evaluation:3

Writer:kingdelee

Related Links:

http://www.cnblogs.com/kingdelee/

1.进制的理解

3进制:

7进制:

 

2.进制的转换

 

2.1

 

八进制 +-*/
1.加法----------------------------------
	277
+	333
-----------------
7+3:12          	------进1,留2
-----------------
7+3+1:13			------加上前一个进1计算,仍旧进1,留3
-----------------
2+3+1:6				------留6
-----------------
632					------以上留位拼接

2.减法----------------------------------
	236
-	 54
-----------------
6-4:2				------留2
-----------------
3-5:6				------借1位,即3+8=11,11-5=6,留6
-----------------
2-1:1				------被借1,即2-1=1.
-----------------
162					------结果

3.乘法----------------------------------
	276
*	 54
-----------------
6*4=30				------6+6=14+6=22+6=30,进3留0; 另一种算法:10:6*4=24, 24/8=3, 24+(24/8)*(10-8)=30;6+6=14+6=22+6=30
-----------------
4*7+3=37			------7+7=16+7=25+7=34,34+3=37,进3留7
-----------------
4*2+3=15			------4+4=10,10+3=13, 进1留3
-----------------
1370

到276*5了;
-----------------
6*5=36				-------6+6=14+6=22+6=30+6=36
-----------------
7*5+3=46			-------7+7=16+7=25+7=34+7=43,43+3=46
-----------------
5*2+4=16			-------5+5=12+4=16
-----------------
1666

  	 1370
+   1666
-----------------
0
-----------------
6+7=15
-----------------
3+6+1=12
-----------------
1+6+1=10
-----------------
1+1=2
-----------------
20250

4.除法----------------------------------
	234
/	  4	
-----------------
反推:4+4=10+4=14+4=20, x=20<23<20+4=24,所以 得4余3
-----------------
反推:20+4=24+4=30+4=34		所以,得7整除
-----------------
47
-----------------

  

 3.16进制是2进制的简写形式

从0写到1111

 

EE,BE,96即

1111 1111,1011 1111, 1001 0110

4.计算机宽度

 5.无符号数

6.有符号数

有符号数,为正数时,和无符号数规则一样

为负数时,

假设数据宽度为1 byte(8 bit)

 

 假设数据宽度为 Doubleword(32Bit)

计算机是通过位运算实现 所有计算

4+5 的运算过程 -----------------------------	



		0000 0100
		0000 0101
+		---------
		0000 1001
		
-----------------------------


1)先得到异或结果,临时性的		
		0000 0100 ---------# 1.1
		0000 0101 ---------# 1.2
异或	---------
		0000 0001 ---------# 1.3

2)再通过与运算 判断是否有进位
如果没有进位的情况下,异或的结果与加的结果一样
如果有进位,拿异或的结果与与的结果继续 异或


			
		0000 0100
		0000 0101 
与 		---------
		0000 0100 ---------# 1.4
		
有1应进位:
		0000 1000 ---------#1.4 -> #1.5

		
结果 存在1不全是0,说明有进位
拿此结果与异或的结果相加

3)继续异或
拿异或的结果和与的结果 继续异或	
	
		0000 0001 --------- $ 1.3
		0000 1000 --------- $ 1.5
异或 		---------
		0000 1001
		
4) 判断3)的与 是否有进位

		0000 0001 --------- $ 1.3
		0000 1000 --------- $ 1.5
与 		---------
		0000 0000

结果 全是0,没有进位。
则异或的结果就是按位加的最终结果

4-5 的运算过程 -----------------------------

即 4+(-5) 

-5:
原码:1000 0101
反码:1111 1010
补码:1111 1011
用补码进行计算

1)

		0000 0100
		1111 1011
异或	---------
		1111 1111
		
2)
		0000 0100
		1111 1011
与		---------
		0000 0000

没有进位,异或的结果就是按位加的结果
		
即 4+(-5) 结果 16进制:FF,10进制 -1, 2进制:1111 1111
-----------------------------

x*y 乘法的本质 就是y个x相加
x/y 除法的本质 就是x能减去?个y

-------------------------------------------------------------------

  

 ollydbg:

反汇编窗口-寄存器

内存窗口-堆栈

--------------------------------------------------------------

寄存器

mov 指令

mov eax,1

mov ebx,1

 

1.立即数到内存

mov byte ptr ds:[内存地址], 1

mov指令:
1.立即数到内存
2.寄存器到内存
3.内存到寄存器

1.立即数到内存
mov byte ptr ds : [0019FF99], 0x12
mov word ptr ds : [0019FF99], 0x1234
mov dword ptr ds : [0019FF99], 0x12345678


				
2.寄存器到内存
mov dword ptr ds : [0019FF99], EAX
mov word ptr ds : [0019FF99], AX
mov byte ptr ds : [0019FF99], AL

3.内存到寄存器
mov eax, dword ptr ds : [0019FF99]

tip:每个编号对应的是一个字节	

读取内存的值
mov eax, dword ptr ds: [0019FF99]

向内存中写入数据
mov dword ptr ds:[0019FF99], eax


内存地址的5种表示形式:
1. [0x13FFC4]
2. [EAX]
	mov dword ptr ds : [EAX], 0x12345678
3. [reg + 立即数]
	读取内存的值:
	mov ecx, 0x13FFD0
	mov eax, dword ptr ds:[ecx + 4]
	
	向内存中写入数据:
	mov edx, 0x13FFD8
	mov dword ptr ds:[edx+0xC], 0x87654321
4. [reg + reg*{1,2,4,8}]
	读取内存的值
	mov eax, 13FFC4
	mov ecx, 2
	mov edx, dword ptr ds:[eax + ecx * 4]
	
	向内存中写入数据:
	mov eax, 13FFC4
	mov ecx, 2
	mov dword ptr ds:[eax + ecx*4], 87654321
	
5. [reg + reg*{1,2,4,8} + 立即数]	
	读取内存的值
	mov eax, 13FFC4
	mov ecx, 2
	mov edx, dword ptr ds:[EAX + ECX*4 + 4]
	
	向内存中写入数据:
	mov eax, 13FFC4
	mov ecx, 2
	mov dword ptr ds:[eax + ecx*4 + 4], 87654321
	

 

存储模式

 

查看内存地址

db 内存地址,一个字节

dw 内存地址,看两个字节

dd 内存地址,四个字节看

add eax, ecx

 

原文地址:https://www.cnblogs.com/kingdelee/p/8436536.html