开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1478|回复: 21
收起左侧

[已解决] 这个问题需要一些功底,大佬来

 关闭 [复制链接]
结帖率:82% (62/76)
发表于 2022-11-28 11:02:37 | 显示全部楼层 |阅读模式   上海市上海市
9精币
问题如图,当传递字节集下标超过256时,参数在内存中多了一个 01 字节,为 42 01 00 00,字节集下标小于等于256都正常,内存中是 x 00 00 00

我怀疑是数组下标超过了256的问题,但是以我多年的编程经验来看,你数组下标超过了255,和你取出值数组的值传递给其他函数,这两者怎么会联系到一起????

百思不得解,大佬来分析一下~~~~

图片字节集自己随便导入一个就可以,不影响本问题,本问题核心本质是数组下标取值后的传递竟然不是原值。

360截图16720331494085.jpg


补充内容 (2022-11-28 11:50):
这个函数要怎么修改我也知道,取第一个字节就可以,不管多出来的01,现在我不是想知道如何修复,我是想知道为什么数组下标超出256以后会多01

最佳答案

查看完整内容

测试确实是这样的,不知道算不算BUG,push不满4个字节的参数到栈里的时候没有用movzx命令零位扩展到32位再压栈,而是直接给低8个字节赋值然后把整个32位压栈,这样高24位的数据都是垃圾数据,所以会影响结果,取513下标的值前面多的数据就不是1而是2了,取769下标的值前面多的数据就是3了,只有在256下标以下的才不受影响。 VS就不是这样,把一个字节压栈的时候首先零扩展为32位再压栈,这样栈里的4个字节的数据就没有垃圾数据了 ...

评分

参与人数 1好评 +1 精币 +1 收起 理由
axinya + 1 + 1 请问大哥们,这是什么插件啊

查看全部评分


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

结帖率:100% (1/1)

签到天数: 19 天

发表于 2022-11-28 11:02:38 | 显示全部楼层   广东省深圳市
捕获.JPG
测试确实是这样的,不知道算不算BUG,push不满4个字节的参数到栈里的时候没有用movzx命令零位扩展到32位再压栈,而是直接给低8个字节赋值然后把整个32位压栈,这样高24位的数据都是垃圾数据,所以会影响结果,取513下标的值前面多的数据就不是1而是2了,取769下标的值前面多的数据就是3了,只有在256下标以下的才不受影响。
VS就不是这样,把一个字节压栈的时候首先零扩展为32位再压栈,这样栈里的4个字节的数据就没有垃圾数据了。
捕获3.JPG
捕获2.JPG

只能说两种语言的处理方式不同,我觉得VS的更合理,易语言里的那种只给al赋值然后把eax都压栈的明显有问题。




点评

64位下是字节就只使用字节,整数就使用整数,32位VS里是会将字节扩展到整数,我一直以为所有语言都是这样处理的,没想到易语言是这样   广东省广州市  发表于 2022-11-28 14:29
易语言生成的比vs少两个字节, 易语言速度还快了一点点点点点点点.....我记得64位下, 参数使用应该是和易语言一样, 4个字节的参数也只使用低32位   广西壮族自治区崇左市  发表于 2022-11-28 14:12

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:82% (62/76)

签到天数: 5 天

 楼主| 发表于 2022-11-28 15:19:55 | 显示全部楼层   上海市上海市
感谢各位大佬,总结一下,确实是易语言字节集数组的一个特性的问题,不知道算不算bug。至少和C++中是不一样的

如图,易语言从字节集数组中取第x个字节,特性是每256次一个循环,这个循环次数插入到高字节序

360截图17911009071539.jpg

举个通俗易懂的例子,假如一个长度无限的重复字节集数组 {66}

bin[256] = {42,0,0,0}
bin[257] = {42,01,0,0}
bin[513] = {42,02,0,0}
bin[769] = {42,03,0,0}
bin[769] = {42,04,0,0}

依次类推,这个是栈中的实际数据格式

如果自己汇编处理,没有处理好字节数,那么就会出现问题,因为多了一个扩展字节

在其他编译器中,是用 movzx 来消除








补充内容 (2022-11-28 15:23):
42就是66,严谨的来说,这里{}应该是66,实际内存中十六进制是42,这些细节不重要
回复

使用道具 举报

签到天数: 19 天

发表于 2022-11-28 11:09:59 | 显示全部楼层   广西壮族自治区柳州市
我觉得应该是表示只有一个字节
回复

使用道具 举报

结帖率:83% (39/47)

签到天数: 19 天

发表于 2022-11-28 11:20:00 | 显示全部楼层   福建省福州市
你用汇编读的是4字节,而不是1个字节
回复

使用道具 举报

结帖率:95% (84/88)

签到天数: 9 天

发表于 2022-11-28 11:40:10 | 显示全部楼层   美国
会不会是自动找了一块其它变量?
还是说要四字节对齐(把所有相关的知识搬上来蒙一蒙)
回复

使用道具 举报

结帖率:82% (62/76)

签到天数: 5 天

 楼主| 发表于 2022-11-28 11:46:03 | 显示全部楼层   上海市上海市
凌哥 发表于 2022-11-28 11:20
你用汇编读的是4字节,而不是1个字节

我意思是参数栈中的数据为什么是 42 01 00 00 ,数组下标256以内就是 42 00 00 00,高于256就会多一个01 字节,很奇怪,按理来说取字节集下标数据,怎么可能会影响到入栈的数据

点评

不要认为栈数据会自动清0, 你push的一个字节, 那你就应该认为只有一个字节有效, 而不是4个字节都有效 编译器会优化, 你只传递了一个字节, 那传递的时候就只改变一个字节, 所以你在使用的时候就只能使用一个字节 [at   广西壮族自治区崇左市  详情 回复 发表于 2022-11-28 12:38
回复

使用道具 举报

结帖率:82% (62/76)

签到天数: 5 天

 楼主| 发表于 2022-11-28 11:46:30 | 显示全部楼层   上海市上海市
真冬 发表于 2022-11-28 11:09
我觉得应该是表示只有一个字节

但是下标 256 以内就是正常的,也是一个字节,就没有多一个 01
回复

使用道具 举报

结帖率:20% (1/5)
发表于 2022-11-28 11:52:21 | 显示全部楼层   广东省深圳市
这个汇编代码 是什么支持库插件吗
回复

使用道具 举报

结帖率:100% (9/9)

签到天数: 17 天

发表于 2022-11-28 12:20:57 | 显示全部楼层   广西壮族自治区崇左市
既然你传递进去的是一个字节, 那就应该只读一个字节, 而不是4个字节, 你这样处理的话, al的值就是你传递进来的值
如果你要怎么处理, 那ret前应该加上 and eax, 0xff
回复

使用道具 举报

结帖率:100% (9/9)

签到天数: 17 天

发表于 2022-11-28 12:38:04 | 显示全部楼层   广西壮族自治区崇左市
yeweiyang 发表于 2022-11-28 11:46
我意思是参数栈中的数据为什么是 42 01 00 00 ,数组下标256以内就是 42 00 00 00,高于256就会多一个01  ...

不要认为栈数据会自动清0, 你push的一个字节, 那你就应该认为只有一个字节有效, 而不是4个字节都有效
编译器会优化, 你只传递了一个字节, 那传递的时候就只改变一个字节, 所以你在使用的时候就只能使用一个字节

QQ截图20221128123539.png

反汇编一下就知道为什么你取到的值是错的了, push的时候只修改了一个字节, 但是push的时候是把整个寄存器push进去
所以在读参数的时候只有一个字节有效

点评

看了汇编我也才知道为什么超过256就出现1, 因为前面的 mov eax, 0x100, push前是 mov al, xx, 所以, eax就是 0x1xx, 所以你按4个字节读, 那就是0x1xx   广西壮族自治区崇左市  发表于 2022-11-28 12:41

评分

参与人数 1好评 +1 精币 +2 收起 理由
yeweiyang + 1 + 2 感谢分享,很给力!~

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表