十万个为什么 发表于 2020-3-5 16:26:20

学习易语言要了解的汇编基础

Win32汇编汇编语言是各种CPU提供机器语言的助记符的集合。0001111000011110001111000111000011110000111100001110001110汇编语言->编译器->机器语言CPU 每一种CPU的汇编语言都不一样,只能通过一种常用的、结构简洁的微处理器的汇编语言来进行学习,从而达到学习汇编语言的两个根本目的:充分获得底层编程的体验,深刻理解机器运行程序的机理。 一、通用寄存器 8个 Eax 累加器和结果寄存器累加器可用于乘、除、输入/输出等操作,它的使用频率很高 子程序的返回值一般是存放在Eax里面的Ebx 数据指针寄存器      它可作为存储器指针来使用Ecx 循环计数器          在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用cl来                      指明位移的位数Edx 指针寄存器          在进行乘、除运算时,它可以为默认的操作数参与运算,也可用于存放I/O的端口地址 eax、ebx、ecx、edx又被称为数据寄存器,低16位分别成为ax,bx,cx,dx,低8位称为al,bl,cl,dl,高8位称为ah,bh,ch,dh Ebp 栈指针寄存器         内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部Esp 堆栈指针寄存器       内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶 堆栈是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。堆,可以看成是一棵树 队列优先,先进先出 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。栈,先进后出由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。堆栈特点:1、先进后出2、往低地址开辟空间3、由操作系统自动分配释放 调用子程序的时候,保存子程序调用完以后要执行的下一条指令的地址 保存参数读取局部变量


Edi 目的地址寄存器       主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器                         操作数的寻址方式,为以不同的地址形式访问存储单元提供方便Esi 源地址寄存器 EAX EBX ECX EDXEDIESI   EAX存放CALL的返回值ECX存放循环次数 64位cpu16个通用寄存器rax rbx rcx rdx rbp rsp rdi rsir8 r9 r10 r11 r12 r13 r14 r15 二、段寄存器 ECS, 代码段寄存器EDS, 数据段寄存器ESS, 堆栈段寄存器EES, 附加段寄存器EFS, 附加段寄存器EGS附加段寄存器 20862086   200086=2000+086=2086寻址地址=段寄存器*16+偏移地址 三、标志位寄存器 Eflags 1.运算结果标志位。一共6个,包括:CF进位标志位、PF奇偶标志位、AF辅助进位标志位、ZF零标志位、 SF符号标志位、OF溢出标志位。CF (bit 0) —— 进位标识,算术操作进行了进位和借位,则此位被设置 PF (bit 2) —— 奇偶标识,结果包含奇数个1,则设置此位AF (bit 4) —— 辅助进位标识,结果的第3位像第4位借位,则此位被设置 ZF (bit 6) —— 零标识,结果为零,此位设置SF (bit 7) —— 符号标识,若为负数则设置此位 OF (bit 11) —— 溢出标识,结果像最高位符号位进行借位或者进位,此标志被设置

SF 符号标志位 2.状态控制标志位。一共3个,包括:TF追踪标志位、IF中断允许标志位、DF方向标志位。 四、指令寄存器 EIP存放下次将要执行的指令在代码段的偏移地址 五、控制寄存器CR0CR2CR3CR4 六、系统表指针寄存器 IDTR -- 中断描述符表信息GDTR -- 全局描述符表信息IDTR -- 局部描述符表信息 七、任务寄存器 TSS 保存任务的状态信息 八、调试寄存器 dr0 – dr7,控制和允许监视进程的调试操作 EAX=变量1 32位汇编指令 一、通用数据传送指令 MOV 传送字或者字节MOVSX 先符号扩展,再传送MOVZX 先零扩展,再传送PUSH把数据压入堆栈PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.

POPAD把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG交换32位寄存器里字节的顺序CMPXCHG 比较并交换操作数(第二个操作数必须为累加器AL/AX/EAX)XADD先交换再累加XLAT字节查表转换 二、算术运算指令 ADD 加法ADC 带进位的加法INC 加1SUB 减法SBB 带借位减法DEC 减1NEG 求反CMP 比较(两个操作数做减法,只修改标志位,不回送结果)MUL 无符号乘法IMUL 整数乘法 三、逻辑运算指令 AND 与运算OR 或运算XOR 异或运算NOT 取反TEST 测试(两个操作数做与运算,只修改标志位,不回送结果) 四、程序转移指令 1、条件转移指令JZ (JE) OPR:结果为0转移,测试条件ZF=1JNZ(JNE) OPR :结果不为0转移,测试条件ZF=0JS OPR :结果为负转移,测试条件SF=1JNS OPR :结果为正转移,测试条件SF=0JO OPR :溢出转移JNO OPR :不溢出转移JP OPR :结果为偶转移JNP OPR :结果为奇转移JC OPR :有进位转移JNC OPR :无进位转移 2.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移) JB(或JNAE) opd :小于或者不大于等于则转移JNB(或JAE) opd:-不小于或者大于等于则转移JA(或NJBE) OPD:-大于或者不小于等于则转移JNA(或JBE) OPD:-不大于或者小于等于则转移 3.带符号比较条件转移指令JL(或JNGE) :小于或者不大于等于则转移JNL(或JGE):不小于或者大于等于则转移JG(或NJLE):-大于或者不小于等于则转移JNG(或JLE):-不大于或者小于等于则转移 4、调用子程序与返回指令CALL 子程序调用RET 子程序返回指令 5、条件标志ZF 零标志 -- 当结果为负时,SF=1,否则,SF=0.AF 辅助进位标志---运算过程中第三位有进位值,置AF=1,否则,AF=0PF 奇偶标志------当结果操作数中偶数个"1",置PF=1,否则,PF=0易语言学习吧提供www.eyy8.vip
SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0.OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0 函数的参数地址比EBP的值高,而函数的局部变量地址比EBP的值低,因此参数或局部变量总是通过EBP加减一定的偏移地址来访问的,比如,要访问函数的第一个参数为EBP+8。 堆栈中到底存储了什么数据?包括了:函数的参数,函数的局部变量,寄存器的值(用以恢复寄存器),函数的返回地址以及用于结构化异常处理的数据(当函数中有try…catch语句时才有,本文不讨论)。这些数据是按照一定的顺序组织在一起的,我们称之为一个堆栈帧(Stack Frame)。一个堆栈帧对应一次函数的调用。在函数开始时,对应的堆栈帧已经完整地建立了(所有的局部变量在函数帧建立时就已经分配好空间了,而不是随着函数的执行而不断创建和销毁的);在函数退出时,整个函数帧将被销毁。 00111101   11111010    0011100000111101   11111010    11111111 10111 push -0x1push 0x8push 0x16010003
只要看到Test、CMP,那么往往下面接着就是一个跳转push 0x52010001 6A FF 6A 08 68 03 00 01 16 68 01 00 01 52 1、尽量避开堆栈寄存器 esp、ebp2、尽量避开call3、尽量避开跳转4、尽量避开特别大的偏移5、选择寄存器赋值(小偏移)、位操作、比较指令(cmp、test、xor)等小指令6、可选择包含比较特殊的常数的操作指令7、死码一般不能超过8条,尽量大于等于3条

2500441817 发表于 2020-3-5 17:17:41


楼主,大恩不言谢了!易语言吧是最棒的!

2500441817 发表于 2020-3-5 17:29:44


论坛不能没有像楼主这样的人才啊!我会一直支持易语言吧。

apgaj 发表于 2020-3-5 18:21:22

楼主发贴辛苦了,谢谢楼主分享!我觉得易语言吧是注册对了!

啊啊啊灰 发表于 2020-3-5 23:56:57


楼主太厉害了!楼主,我爱你!我觉得易语言吧真是个好地方!

小猴 发表于 2020-3-7 00:12:03

支持一下

810166688 发表于 2020-5-16 13:31:25


这个帖子不回对不起自己!我想我是一天也不能离开易语言吧。

2045109515 发表于 2020-7-2 20:22:39

6,虽然有一点感觉头晕眼花

yyz860723 发表于 2021-5-28 22:57:10

楼主发贴辛苦了,谢谢楼主分享!我觉得易语言吧是注册对了!

白辰 发表于 2023-7-10 15:33:31


楼主发贴辛苦了,谢谢楼主分享!我觉得易语言吧是注册对了!
页: [1]
查看完整版本: 学习易语言要了解的汇编基础