汇编与易语言

一、堆栈结构

在这里插入图片描述

可以看出一个函数局部变量和实参的位置

二、易语言例子解析

带上下文

在这里插入图片描述

00000000 - 60     pushad 
00000001 - 8B 4D 10     mov ecx, dword [ebp+0x10]
00000004 - 8B 7D 08     mov edi, dword [ebp+0x08]
00000007 - 8B 75 0C     mov esi, dword [ebp+0x0C]
0000000A - F3 A4     rep movsb 
0000000C - 61     popad 

这里牵涉到其他寄存器,需要保存环境,默认ebp esp 自动还原
pushad是将8个32位寄存器压入栈中,压入的顺序依次为 EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
popad 相反

带局部变量

在这里插入图片描述

置入代码 ({ 139, 69, 8, 139, 0, 137, 69, 252 })
' mov eax , dword ptr [ebp+08h]  //第一个参数地址赋值给eax
' mov eax , dword ptr [eax]  //把上步骤参数的地址的值取出来
' mov dword ptr [ebp-04h] , eax //再把值传给临时变量ret

这里没看到小数的转换,只是取值而已, 说明类型无关

在这里插入图片描述

无局部变量

在这里插入图片描述

末尾的返回值无效的,只是为了保证编辑器语法通过,可以任意值
这里没有后面的俩个ret

在这里插入图片描述

三、易语言进阶例子

数据8字节的(长整数,双精度浮点数)

在这里插入图片描述

置入代码 ({ 139, 69, 8, 255, 48, 143, 69, 248, 255, 112, 4, 143, 69, 252 })
' mov eax , dword ptr [ebp+08h]  ’第一个参数翻入eax
' push dword ptr [eax]  把参数所指的值并入栈 4个字节 低位
' pop dword ptr [ebp-08h] 把参数的值赋值给第二个局部变量
' push dword ptr [eax+04h]  4个字节 高位
' pop dword ptr [ebp-04h]   高位对应局部变量高位

在这里插入图片描述

末尾多俩个ret指令,无用,但看着别扭
低地址存低位,高地址存高位,栈是往低地址扩展的
从汇编看这个函数stdcall调用方式

四、c/c++例子

__cdecall:参数右到左入栈,调用方维持堆栈平衡(默认)
__stdcall:参数右到左入栈,被调用方堆栈平衡

SS:stack segment register 栈段暂存器
SP:stack pointer 栈指针

在VS编辑器中中堆栈会自动帮你配平衡,只需要关键汇编代码,比如下例子
eax保存函数返回值,edx保存高位

无局部变量

int  add(int a, int b)
{
	_asm
	{
		mov eax, dword ptr[ebp + 08h]  //第一个参数
		add eax, dword ptr[ebp + 0Ch]  //第二个参数,堆栈的地址高到低,先入栈
	}
	//return (a + b);//K&R推荐return都打括号
}

标准调用方式

int __stdcall add(int a, int b)
{
	_asm
	{
		mov eax, dword ptr[ebp + 08h]
		add eax, dword ptr[ebp + 0ch]
	}
	//return (a + b);//K&R推荐return都打括号
}

在这里插入图片描述

RETN 8看到没,被调用方维持堆栈平衡,2个参数8个字节

c调用方式

int  add(int a, int b)
{
	//int c = 10;
	_asm
	{
		mov dword ptr[ebp - 04h], 10
		mov eax, dword ptr[ebp + 08h]
		add eax, dword ptr[ebp + 0ch]
		add eax, dword ptr[ebp -04h]
	}
	//return (a + b + c);//K&R推荐return都打括号
}

在这里插入图片描述

数据8字节的(长整数,双精度浮点数)


long long add(long long a, long long b)
{
	return (a + b);//K&R推荐return都打括号
}

long long 是8个字节,低位低位相加,高位高位相加
在这里插入图片描述
增加一个临时变量

long long  add(long long a, long long b)
{
	long long c = 10L;
	return (a + b + c);//K&R推荐return都打括号
}

在这里插入图片描述

五、相关指令

leave 指令

等价于

	mov esp, ebp
	pop ebp

call 指令

1、段内转移的CALL指令等价于:
  push eip
  jmp   目的位置
2、段间转移的CALL指令等价于:
  push CS
  push eip
  jmp   目的位置

RETN/RETF 指令

RETN指令用于从段内CALL;
RETF指令用于从段间CALL。

俩种格式:
RETN/RETF
RETN/RETF 操作数

RETN等价于:POP   eip
RETF等价于:
POP   eip
POP   CS
而带有操作数的RETN/RETF指令则是在POP之后,执行ESP=ESP+操作数

六、总结

1、汇编指令结合od ,分析了易语言中的置入代码.
2、VS编辑器内联汇编分析c/c++代码, 快捷键alt +8 查看反汇编窗口.
3、坑就是VS编译要禁止优化, od出现大量db时, 删除分析即可
终于完结了, 通过实践果然对汇编与内存的印象更加深刻~

七、相关文档

通用32位CPU 常用寄存器及其作用

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
通用型哈希表,最早发出的哥们儿已经不知去向(感谢他),目前的更新和优化好像都是酷宝贝在做,不过我经常要导入模块,所以一直想用一个不需要类直接复制粘贴程序集就能用的版本,经过一段时间打磨,总算自己写了一个,调试过程还是有不少曲折的,但是考虑到 易语言 都过了二十年了,知名度依旧不高,所以没什么好吝啬的,分享出来,人海茫茫,你能碰到的都是兄弟,不是竞争对手。 碰巧写TCP组包,考虑用哈希表存储数据,这也引出了 将原先的哈希读写拆分出 取指针 和 指针操作  的需求。 这个程序集的特点: ' 分层次展现 ' 中文函数(公开)为哈希表主要函数 ' 中文函数(未公开)为哈希表扩展功能函数 ' 英文函数为独立的工具函数 ' 带_的英文函数是哈希表的附属函数 ' 1.对于取 哈希值的算法 进行了扩展,变成4种 ' 2.增加了 CRC32_PTR 汇编算法,使用查表方式计算,速度与按字节计算的传统哈希相近,比RtlComputeCrc32快且兼容性强,比传统的哈希算法碰撞率低 ' 3.增加了 hash_PTR 汇编算法,按字节计算哈希结果和之前一样,按字和按3字计算可用于文本key(但要注意对齐,比如Unicode是字对齐) ' 4.增加了 哈希_更改  子程序,这是 将key作为handle使用,用于快速管理资源 的一种理解方式 ' 5.在哈希取值之前分离出 哈希_取指针 ,返回数据的内存地址,同时让哈希_取值命令更加简单易读 ' 6.增加了 取素数不小于 的函数,用于创建和扩展链表,最早的创建方式不科学,遇到有规律的数会产生严重碰撞 ' 7.修复了内存泄露的bug,具体位置在 哈希_添加 中找到相同key数据之后,补充了heapfree命令 ' 8.更改取值方式,这个我看到酷宝贝也改了,取值直接返回指针,而不是再度申请内存(该操作同样会泄露) 阐述一下CRC32_PTR,综合考量了 速度、资源占用 ,将表作为数据置入,用CALL/POP取出,比API快,已对比过各易论坛、资源网、目前是最快最稳定的,欢迎高手拍砖!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骇客之技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值