gwgirl 发表于 2022-1-19 16:55

汇编学习笔记!认真看!

本帖最后由 gwgirl 于 2022-1-19 16:58 编辑

运行环境:
如 WIN10
涉及工具:
OD
编程语言:
汇编

以下为主题内容:
汇编语言

01.汇编语言简介
机器语言的由来:方便我们阅读和记忆机器指令(硬编码)
操作:寄存器EBX的内容移动到EAX中
机器指令:1000 1001 1101 1000 = 89 D8
汇编指令:mov eax,ebx
汇编指令就是机器指令的助记符
指令的本质:数据移动+数据运算(位运算)

机器语言(硬编码):由0和1组成
寄存器:CPU上的一个元件,它可以暂时保存数据(0,1)

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

02.进制
十进制:      01      23456789101112131415
二进制:      0000   0001   0010   0011   0100   0101   0110   0111            
十六进制:      0      1            2               3         4         5             6               7            
    1000   1001   1010   1011   1100   1101   1110   1111
8         9         a             b                c          d             e      f

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

03.数据寄存器
寄存器:CPU上的一个元件(部件),读取的速度非常快。
数据寄存器:保存操作数,计算结果。
EAX(Accumulator):累加寄存器,也称之为累加器;
ECX(Count):计数器寄存器;比如C语言写了个for循环,循环次数就存在这里;
EDX(Data):数据寄存器;      
EBX(Base):基地址寄存器;
这些都32位寄存器;32位寄存器又可以拆分成16位寄存器:16位寄存器分为低八位和高八位;
十六位寄存器:      AX      CX      DX      BX
低八位寄存器:      AL      CL      DL      BL      
高八位寄存器:      AH      CH      DH      BH      

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

04.栈指针寄存器--堆栈控制
栈指针寄存器:操作栈的寄存器;
栈:      参数,变量;
ESP:栈顶寄存器;栈顶的指针;一? 栈现在用到那了
EBP:栈底寄存器;栈底的指针;

PUSH指令:?? PUSH 立即数/内存/寄存器 ??
PUSH指令执行过程,先提升ESP,再把数据存入
POP指令:   ??   POP 内存/寄存器    ??
POP指令执行过程,把数据从中取出,然后在下降

PUSHFD指令:
就是把EFLAGS寄存器的值全部压入到堆栈中,在堆栈中修改
POPFD指令: PUSH 立即数
EFLAGS寄存器的值在堆栈中修改完成后在弹回EFLAGS寄存器
--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

05.变址寄存器
除了可与数据寄存器的使用方法相同以外,还可以通过在应用指令的操作数中组合使用其他的软元件编号和数值,从而在程序中更改软元件的编号和数值内容的特殊寄存器
ESI:      源变址寄存器,用来拷贝源字符串      
EDI:      目的变址寄存器,用来复制到目标字符串
这两个寄存器里存放的是地址,复制的内容是地址所存放的内容
?? 复制完成后寄存器地址自动下降

MOVS指令:         
??MOVS执行完成后ESI/EDI地址上移或下降由DF位控制??
移动数据内存-内存 循环执行实现整块内存拷贝   
BYTE/WORD/DWORD
MOVS BYTE PTR ES.,BYTE PTR DS:
把ESI所指向地址值中1个字节的数移动到EDI:
执行后ESI和EDI所指向地址向后移动1位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
简写为:MOVSB
MoVs WORD PTR ES:,WORD PTR DS:
把ESI所指向地址值中2个字节的数移动到EDI:
执行后ESI和EDI所指向地址向后移动2位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
简写为:MOVSW
MOVs DWORD PTR ES:,DWORD PTR DS:
把ESI所指向地址值中4个字节的数移动到EDI:
执行后ESI和EDI所指向地址向后移动4位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
简写为:MOVSD

STOS指令:       
??STOPS执行完成后EDI地址上移或下降由DF位控制??
与MOVS用法一致
将AI/AX/EAX的值存储到指定的内存单元
STOS BYTE PTR ES:                        简写为STOSB
把AI的值存储到EDI指定的内存单元:
执行后EDI所指向地址向后移动1位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
STOS WORD PTR ES:                      简写为STOSW
把AX的值存储到EDI指定的内存单元:
执行后EDI所指向地址向后移动1位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
STOS DWORD PTR ES                简写为STOSD
把EAX的值存储到EDI指定的内存单元:
执行后EDI所指向地址向后移动1位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1

REP指令:
按计数寄存器(ECX)中指定的次数重复执行字符串指令
MOV ECX,10修改ECX值 为5 代表要让它循环执行5次
REP MOVSD 执行后ESI和EDI所指向地址向后移动20位;
REP STOSB STOSW STOSD
REP MOVS BYTE PTR DS:,BYTE PTR DS:

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

06.指令指针寄存器--CPU下一次将要执行的代码地址
EIP:CPU下一次将要执行的代码地址
指令寄存器IR ,是临时放置从内存里面取得的代码数据(也就是指令),然后等待译码器来译码。

JMP指令:      
?? 修改EIP寄存器的指令,为了让CPU运行到修改后位置 ??
JMP 寄存器/立即数
JMP 做的事情      MOV EIP,寄存器/立即数/内存      简写:JMP 寄存器/立即数/内存
执行完成后有返回了第一次调用函数的下面;
比如我们使用了两次JMP,让它实现谁调用了它,就返回到谁下面;
使用需要做一些改进,我们在写JMP调用之前,我们把JMP下一次要执行的地址保存到EBX中;
起到保存返回地址的作用;然后跳到执行函数的位置,执行完函数,JMP NEAR EBX,返回到
EBX保存的地址位置。

CALL指令:
?? 修改EIP的值,把CALL下一行地址存入堆栈 ??
为了解决函数调用返回的繁琐操作,CPU给了CALL这个函数调用指令
CALL 做的事情         PUSH CALL下一行地址到堆栈ESP
S    在堆栈中存储CALL指令的下一行地址
指令格式:CALL 立即数、寄存器、内存
这一条指令就实现了保存返回地址并且修改EIP的功能,而为了配套我们在函数末尾也使用一条
指令来取出我们保存的地址并且修改EIP,让CPU下一步执行EIP地址;
RETH指令:
?? 与CALL搭配使用 ??
RETH 做的事情         ADD ESP,4(ESP提升4字节)
      MOV EIP,
简写为:RET




--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

07.标志寄存器--EFLAGS寄存器
   运算→>>EFLAGS寄存器→>>JCC

[*]    CF         ------                进位标志位                                                                        

如果运算中发生借位或进位,CF的值会置为1:+ - × ÷ 都会发生进位或借位;
SUB8,68和6相减,没有发生借位,CF = 0;
SUB6,86和8相减,6不够8减需要借位,CF = 1;



[*]JB      JNAE      小于则跳转                                        CF = 1
[*]JBE      JNA                小于等于则跳转            CF = 1ORZF = 1
[*]JNBE      JA                大于则跳转                      CF = 0 AND ZF = 0
[*]JBE      JNA                小于等于则跳转            CF = 1ORZF = 1

这个符号位通常用指示无符号整形运算的溢出状态


[*]    PF                ------                奇偶位标志位                                                                        


[*]如果结果的最低有效字节(east-significant byte)包含偶数个1位则该位

置1,否则清零。

[*]利用PF可进行奇偶校验检查:
[*]需要传输"11001110",数据中含5个"1",所以其奇校验位为"0",

同时把"110011100""传输给接收方,接收方收到数据后再一次计算奇偶
性,"110011100"中仍然含有5个"1",所以接收方计算出的奇校验位还
是"0",与发送方一致,表示在此次传输过程中未发生错误
例子:
MOV AL,0CE
ADD AL,0
                      JP/JPE指令:若1出现次数为偶数则跳转   
中文含义:jump if Parity (Even)
检查符号位:      PF=1
典型C应用:      (null);
                      JNP/JPO指令:若1出现次数为奇数则跳转      
中文含义:      jump if not parity (odd)
检查符号位:      PF=0
典型C应用:      (null);


[*]    AF                ------                FZ进位标志位                                                               


[*]如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。
[*]这个标志在BCD(binary-code decimal)算术运算中被使用。



[*]    ZF                ------                零标志位                                                                              

如果运算结果为0则将其置为1,反之清零:
CMP EAX,EAX因为EAX和EAX相同,相减等于0,所以ZF = 0;
1.    JZ/JE指令:      若为0则跳转;若相等则跳转   
中文含义:      jump if zero;jump if equal
检查符号位:      ZF=1
典型C应用:      if (i == j);if (i == 0);   
       JNZ/JNE指令:若不为0则跳转;若不相等则跳转
中文含义:      jump if not zero;jump if not equal
检查符号位:      ZF=0
典型C应用:      if (i != j);if (i != 0);
2.   JBE/JNA指令:若低于等于则跳转;若不高于则跳转
中文含义:jump if below equal;jump if not above
检查符号位:      ZF=1或CF=1
典型C应用:      if (i <= j);
       JNBE/JA指令:若不低于等于则跳转;若高于则跳转
中文含义:jump if not below equal;jump if above
检查符号位:      ZF=0或CF=0
典型C应用:      if (i > j);


[*]    SF                ------                符号标志位                                                                        

收到运算结果的最高有效位影响,通常用来判断我们运算结果是正数还是负数
一般情况用作判断有符号数
1.    JS指令:若为负则跳转   
中文含义:jump if sign
检查符号位:      SF=1
典型C应用:      if (i < 0);   
       JNS指令:若为正则跳转
中文含义:      jump if not sign
检查符号位:      SF=0
典型C应用:      if (i > 0);
2.    JL/JNGE指令:若小于则跳转;若不大于等于则跳转
中文含义:jump if less;jump if not greater equal
检查符号位:      SF != OF
典型C应用:      if (si < sj);
       JNL/JGE指令:若不小于则跳转;若大于等于则跳转
中文含义:jump if not less;jump if greater equal
检查符号位:      SF = OF
典型C应用:      if (si >= sj);


[*]    TF                ------                单步标志位                                                                        


[*]TF陷阱标志(trap flag):用于调试的单步方式操作
[*]TF = 1时每条指令执行后产生陷阱,由系统控制计算机
[*]TF = 0时CPU正常工作
[*]CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则产生单步中

断(中断类型码为1),引发中断过程,执行中断处理程序


[*]    DF                ------                方向标志位                                                                        

这个方向标志控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。         
设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),   
清除该标志则使得串指令自动递增。                                 

[*]STD以及CLD指令分别用于设置以及清除DF标志。




[*]    OF                ------                溢出标志位                                                                        

这个符号位通常用指示有符号整形运算的溢出状态
OF符号位进位判断:
符号位有进位OF为1,没有进位OF位为零
最高有效数值位想符号位产生的进位 进位了为1,没进位为0;
               ??OF的值等于符号位与最高有效值位进行异或运算 ??

有符号运算使用指令:



[*]JO                        结果溢出了则跳转                              OF = 1
[*]JNO                        结果没溢出则跳转                              OF = 0
[*]JL                JNGE      小于则跳转                                     SF != OF
[*]JNL      JGE                大于等于则跳转                           SF= OF
[*]JLE      JNG                小于等于则跳转            ZF =1 OR SF != OF
[*]JNLE      JG                大于则跳转                      ZF = 0 AND SF = 0



--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

08.段寄存器

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

09.常用指令
MOV EAX,1234
指令码 目标操作数 源操作数
要点:<1>目标操作数必须为容器(寄存器或内存)
   <2>目标操作数必须和源操作数宽度相同
   <3>无法从内存移动数据到内存

指令格式:
1、MOV r/m8,r8                r通用寄存器
2、MOV r/m16,r16      m代表内存
3、MOv r/m32,r32      imm代表立即数
4、MOV r/8,r/m8      r8代表8位通用寄存器
5、MOV r16,r/m16      m8代表8位内存
6、MOV r32,r/m32      imm8代表8位立即数
7、MOV r8, imm8
8、MOV r16, imm16
9、MOV r32, imm32

LEA寻址指令:
LEA EAX,DWORD PTR DS:
把内存的地址读取到寄存器EAX
LEA EAX,DWORD PTR DS:
把寄存器的地址读取到寄存器EAX
LEA指令与MOV指令的区别:

MOV指令是 数据      传送指令-------传送数据
LEA指令是   有效地址 传送指令-------取偏移地址

MOV OPRD1 OPRD2
OPRD1: 目的操作数(寄存器,存储器,累加器)
OPRD2: 源操作数(寄存器,存储器,累加器,立即数)

MOVS指令:
移动数据内存-内存 循环执行实现整块内存拷贝   
BYTE/WORD/DWORD
MOVS BYTE PTR ES.,BYTE PTR DS:
把ESI所指向地址值中1个字节的数移动到EDI:
执行后ESI和EDI所指向地址向后移动1位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
简写为:MOVSB
MoVs WORD PTR ES:,WORD PTR DS:
把ESI所指向地址值中2个字节的数移动到EDI:
执行后ESI和EDI所指向地址向后移动2位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
简写为:MOVSW
MOVs DWORD PTR ES:,DWORD PTR DS:
把ESI所指向地址值中4个字节的数移动到EDI:
执行后ESI和EDI所指向地址向后移动4位;为了方便循环执行
如果想要向上执行拷贝,修改标志寄存器,D方向标志修改为1
简写为:MOVSD

STOS指令:
与MOVS用法一致
将AI/AX/EAX的值存储到指定的内存单元
STOS BYTE PTR ES:                        简写为STOSB
STOS WORD PTR ES:                      简写为STOSW
STOS DWORD PTR ES                简写为STOSD
例子:
MOV EAX,12345678                              观察EDI的值
MOV EDI,12FFC4
STOS BYTE PTR ES:
STOS WORD PTR ES:
STOS DWORD PTR ES

例子:
MOV EDI,12FFD8
MOV ESI,12FFDO
MOVS DWORD PTR ES:, DWORD PTR DS:
观察EDl的值
修改标志寄存器中D位的值,然后在执行下面的指令:
MOV EDI,12FFD8
MOV ESI,12FFDO
MOVS DWORD PTR ES:, DWORD PTR DS:

REP指令:
按计数寄存器(ECX)中指定的次数重复执行字符串指令
MOV ECX,10修改ECX值 为5 代表要让它循环执行5次
REP MOVSD 执行后ESI和EDI所指向地址向后移动20位;
REP STOSB STOSW STOSD
REP MOVS BYTE PTR DS:,BYTE PTR DS:

MOV移动指令
ADD加法指令:
SUB减法指令:
AND与运算指令:
OR或运算指令:
XOR异或运算指令:
NOT指令: NOT R/M 按位取反

SAL/SHL左移指令:
SAR/SHR右移指令:
CMP比较指令:运算结果不保存,只修改标志寄存器
TEST与逻辑指令:运算结果不保存,只修改标志寄存器

修改EIP寄存器的指令,EIP存放的是CPU下一次执行的地址
JMP指令:
执行完成后有返回了第一次调用函数的下面;
JMP 寄存器/立即数/内存
比如我们使用了两次JMP,让它实现谁调用了它,就返回到谁下面;
使用需要做一些改进,我们在写JMP调用之前,我们把JMP下一次要执行的地址保存到EBX中;
起到保存返回地址的作用;然后跳到执行函数的位置,执行完函数,JMP NEAR EBX,返回到
EBX保存的地址位置。

为了解决函数调用返回的繁琐操作,CPU给了CALL这个函数调用指令
CALL指令:
指令格式:CALL 立即数、寄存器、内存
这一条指令就实现了保存返回地址并且修改EIP的功能,而为了配套我们在函数末尾也使用一条
指令来取出我们保存的地址并且修改EIP,让CPU下一步执行EIP地址;RETH指令

PUSH指令: PUSH 立即数
PUSH指令执行过程,先提升ESP,再把数据存入
POP指令:POP EAX
POP指令执行过程,把数据从中取出,然后在下降

PUSHFD指令:
就是把EFLAGS寄存器的值全部压入到堆栈中,在堆栈中修改
POPFD指令: PUSH 立即数
EFLAGS寄存器的值在堆栈中修改完成后在弹回EFLAGS寄存器

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

17.汇编的函数是什么
1.函数就是一系列指令的集合,实现某个能重复使用的特定功能
<1>      用JMP来执行函数
<2>      用CALL来执行函数 通常使用CALL来调用
两种传参方式的比较:
<1>寄存器传参
优点:速度快,参数使用时定位准确
缺点:寄存器个数太少
<2>堆栈传参(内存传参)
优点:空间大,适用于参数个数较多的情况。
缺点:速度相对慢,参数使用时定位麻烦(ESP寻址)。

--------------???????????????????????? 华丽的分割线 ????????????????????????--------------

18.堆栈
1.堆栈就是一块内存,操作系统在程序刚刚启动的时候,就要分配一个内存给程序使用,用来存放临时数据。
2.和数据结构的堆栈无关。
3.查找堆栈。OD命令行查看 S的地址就会看到当前栈顶和栈底。
修改栈顶指针,存储数据。

堆栈的相关指令:
1.PUSH指令:
功能:
<1>先堆栈中压入数据
<2>修改栈顶指针ESP寄存器
指令格式:
PUSH R16/R32/M16/M32
PUSH IMM
2.POP指令:
功能:
<1>将栈顶数据存储到寄存器、内存;
<2>修改栈顶指针ESP寄存器
指令格式:
PUSH R16/R32/M16/M32
堆栈的两种方式:
ESP寻址和EBP寻址
堆栈平衡
1、什么是堆栈平衡
<1>如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条                                    
指令时,ESP指向的是CALL指令压入栈中的地址。
<2>如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。

函数调用完成后一定要平衡堆栈,把写入堆栈且已经使用完不需要存储的值释放掉
1.CALL调用之后给ESP下降到写入ESP之前的位置      ADD ESP,8(外平栈)
2.RETN返的的时候让ESP直接下降到ESP之前的位置: RETN 8    (内平栈)   
(8代表下降了8个字节,因为之前压入堆栈两个4bytes数据,所以下降8)            
------------???????????????????????? JCC指令详细解释 ????????????????????????------------

19.JCC指令
<1>JCC指令组介绍
?? jmp condition code -------条件跳转指令   指令本质为选择性修改EIP ??

1.    JZ/JE指令:      若为0则跳转;若相等则跳转   
中文含义:      jump if zero;jump if equal
检查符号位:      ZF=1
典型C应用:      if (i == j);if (i == 0);   
       JNZ/JNE指令:若不为0则跳转;若不相等则跳转
中文含义:      jump if not zero;jump if not equal
检查符号位:      ZF=0
典型C应用:      if (i != j);if (i != 0);

2.    JS指令:若为负则跳转   
中文含义:jump if sign
检查符号位:      SF=1
典型C应用:      if (i < 0);   
       JNS指令:若为正则跳转
中文含义:      jump if not sign
检查符号位:      SF=0
典型C应用:      if (i > 0);

3.    JP/JPE指令:若1出现次数为偶数则跳转   
中文含义:jump if Parity (Even)
检查符号位:      PF=1
典型C应用:      (null);
       JNP/JPO指令:若1出现次数为奇数则跳转      
中文含义:      jump if not parity (odd)
检查符号位:      PF=0
典型C应用:      (null);

4.    JO指令:若溢出则跳转
中文含义:jump if overflow
检查符号位:      OF=1
典型C应用:      (null);
       JNO指令:若无溢出则跳转
中文含义:      jump if not overflow
检查符号位:      OF=0
典型C应用:      (null);

5.    JC/JB/JNAE指令:若进位则跳转;若低于则跳转;若不高于等于则跳转
中文含义:jump if carry;jump if below;jump if not above equal
检查符号位:      CF=1
典型C应用:      if (i < j);
       JNC/JNB/JAE指令:若无进位则跳转;若不低于则跳转;若高于等于则跳转;
中文含义:jump if not carry;jump if not below;jump if above equal
检查符号位:      CF=0
典型C应用:      if (i >= j);

6.    JBE/JNA指令:若低于等于则跳转;若不高于则跳转
中文含义:jump if below equal;jump if not above
检查符号位:      ZF=1或CF=1
典型C应用:      if (i <= j);
       JNBE/JA指令:若不低于等于则跳转;若高于则跳转
中文含义:jump if not below equal;jump if above
检查符号位:      ZF=0或CF=0
典型C应用:      if (i > j);

7.    JL/JNGE指令:若小于则跳转;若不大于等于则跳转
中文含义:jump if less;jump if not greater equal
检查符号位:      SF != OF
典型C应用:      if (si < sj);
       JNL/JGE指令:若不小于则跳转;若大于等于则跳转
中文含义:jump if not less;jump if greater equal
检查符号位:      SF = OF
典型C应用:      if (si >= sj);

8.    JLE/JNG指令:若小于等于则跳转;若不大于则跳转
中文含义:jump if less equal;jump if not greater
检查符号位:      ZF != OF 或 ZF=1
典型C应用:      if (si <= sj);
       JNLE/JG指令:若不小于等于则跳转;若大于则跳转
中文含义:jump if not less equal;jump if greater
检查符号位:      SF=0F 且 ZF=0
典型C应用:      if(si>sj);

<1>JCC指令组介绍
       jmp condition code -------条件跳转指令   指令本质为选择性修改EIP
JE      JZ                结果为零则跳转(相等时跳转)                ZF = 1
JNE      JNZ                结果补位零则跳转(不相等时跳转)      ZF = 0
JS                        结果为负则跳转                              SF = 0
JNS                        结果为非负则跳转                              SF = 1
JP      JPE                结果中1的个数为偶数则跳转                PF = 1
JNP      JPO                结果中1的个数为偶数则跳转                PF = 0
JO                        结果溢出了则跳转                              OF = 1
JNO                        结果没溢出则跳转                              OF = 0

<2>跳转条件在哪?
      JCC指令通常跟运算指令组合使用,根据运算指令的运算结果选择是否修改EIP

[*]常见运算指令如:CMP、TEST
[*]CMP指令:相当于SUB指令,但是相减的结果并不保存到第一个操作数中
[*]TEST指令:相当于AND指令,但是与的结果并不保存到第一个操作数中


-----------------????????????????????????????????????????????????-------------------

17.计算机的存储规则概述
存储规则:即
常见的存储规则
整数-->补码-->二进制
浮点数-->IEEE规范-->二进制
字符-->ASCLL/UNICODE-->二进制

整数的编码规则
确定容器宽度 → 判断符号
无符号   → 正数 → 直接转
                        有符号    → 负数→ 转换规则



-----------------????????????????????????????????????????????????-------------------

18.位运算之加减乘除加法        4+5=?

直到与的结果全为0的时候计算结束
减法 4-5=?               其实就是转换为4+(-5)进行加法操作
乘法 4*5=?         其实就是转换为4+4+4+4+4进行操作
除法 15÷5=?      其实就是转换为15+(-5)+(-5)+(-5)进行加法操作


-----------------????????????????????????????????????????????????-------------------


19.堆栈图







fyh505099 发表于 2022-1-19 21:10

感谢分享 收藏一下

yoyobo 发表于 2022-1-19 22:40

感谢分享 你的成果

sibaichi 发表于 2022-1-20 09:06

好详细。感谢分享。收藏了

longge188 发表于 2022-1-20 11:53

感谢分享,学习一下

yata 发表于 2022-1-22 04:29

来了来了,顶一顶,好东西!

阔达打芝麻 发表于 2022-1-22 22:24

感谢大佬的分享

谦让扯诺言 发表于 2022-1-22 22:41

这么神?大神求带带!

明亮演变 发表于 2022-1-22 22:43

谢谢分享

单纯爱电话 发表于 2022-1-23 10:45

谢谢分享
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 汇编学习笔记!认真看!