下面汇编函数里的两条语句会不会内存越界

捕鲸叉 2012-06-22 06:32:59
对下面的
invoke RtlZeroMemory, addr @bufTemp1, 10
invoke RtlZeroMemory, addr @bufTemp2, 20
两行代码有疑问,里面的10和20是怎么来的,回不内存越界?



_openFile proc

local @stOF: OPENFILENAME
local @hFile, @hMapFile
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
local @dwCount; 计数,逢16则重新计
local @dwCount1; 地址顺号
local @dwBlanks; 最后一行空格数

invoke RtlZeroMemory, addr @stOF, sizeof @stOF
mov @stOF.lStructSize, sizeof @stOF
push hWinMain
pop @stOF.hwndOwner
mov @stOF.lpstrFilter, offset szExePe
mov @stOF.lpstrFile, offset szFileName
mov @stOF.nMaxFile, MAX_PATH
mov @stOF.Flags, OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
invoke GetOpenFileName, addr @stOF; 让用户选择打开的文件
.if !eax
jmp @F
.endif
invoke CreateFile, addr szFileName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL,\
OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile, eax
invoke GetFileSize, eax, NULL ;获取文件大小
mov totalSize, eax

.if eax
invoke CreateFileMapping, @hFile, NULL, PAGE_READONLY, 0,0, NULL
.if eax
mov @hMapFile, eax
invoke MapViewOfFile, eax, FILE_MAP_READ, 0,0,0
.if eax
mov lpMemory,eax ;获得文件在内存的映像起始位置
assume fs:nothing
push ebp
push offset _ErrFormat
push offset _Handler
push fs:[0]
mov fs:[0], esp

; 开始处理文件
; 缓冲去初始化
invoke RtlZeroMemory, addr @bufTemp1, 10
invoke RtlZeroMemory, addr @bufTemp2, 20
invoke RtlZeroMemory, addr lpServicesBuffer, 100
invoke RtlZeroMemory, addr bufDisplay, 50

mov @dwCount, 1
mov esi, lpMemory
mov edi, offset bufDisplay

;将第一列写入lpServicesBuffer
mov @dwCount1,0
invoke wsprintf, addr @bufTemp2, addr lpszFilterFmt4, @dwCount1
invoke lstrcat, addr lpServicesBuffer, addr @bufTemp2

;求最后一行的空格数(16-长度%16)*3
xor edx, edx
mov eax, totalSize
mov ecx, 16
div ecx
mov eax, 16
sub eax, edx
xor edx, edx
mov ecx, 3
mul ecx
mov @dwBlanks, eax

.while TRUE
.if totalSize == 0; 最后一行
;填充空格
.while TRUE
.break .if @dwBlanks == 0
invoke lstrcat, addr lpServicesBuffer, addr lpszBlank
dec @dwBlanks
.endw
;第二列和第三列中间的空格
invoke lstrcat, addr lpServicesBuffer, addr lpszManyBlanks
;第三列的内容
invoke lstrcat, addr lpServicesBuffer, addr bufDisplay
;回车换行符号
invoke lstrcat, addr lpServicesBuffer, addr lpszReturn
.break
.endif
; 将alf翻译成可以显示的ascii码字符,注意不要破坏al的值
mov al, byte ptr [esi]
.if al > 20h && al < 7eh
mov ah, al
.else ;如果不ASCII码值,则显示‘.’
mov ah, 2Eh
.endif
;写入第三列的值
mov byte ptr [edi], ah
;win2k不支持al字节级别,经常导致程序无故结束,
;因此用以下方法替代
;invoke wsprintf,addr @bufTemp1,addr lpszFilterFmt3,al

mov bl, al
xor edx, edx
xor eax, eax
mov al, bl
mov cx, 16
div cx; 结果放在al中,余数在dl中

;组合字节的十六进制字符串到@bfuTemp1中。类似与 "7F\0"
push edi
xor bx, bx
mov bl, al
movzx edi,bx
mov bl, byte ptr lpszHexArr[edi]
mov byte ptr @bufTemp1[0], bl

xor bx, bx
mov bl, dl
movzx edi, bx
mov bl, byte ptr lpszHexArr[edi]
mov byte ptr @bufTemp1[1], bl
mov bl, 20h
mov byte ptr @bufTemp1[2],bl
mov bl, 0
mov byte ptr @bufTemp1[3], bl
pop edi

;将第2列写入lpServicesBuffer
invoke lstrcat, addr lpServicesBuffer, addr @bufTemp1
.if @dwCount == 16; 已到16个字节
;第二列和第三列中间的空格
invoke lstrcat, addr lpServicesBuffer, addr lpszManyBlanks
;显示第三列字符
invoke lstrcat, addr lpServicesBuffer, addr bufDisplay
;回车换行
invoke lstrcat, addr lpServicesBuffer, addr lpszReturn

;写入内容
invoke _appendInfo, addr lpServicesBuffer
invoke RtlZeroMemory, addr lpServicesBuffer, 100

.break .if dwStop == 1

;显示下一行的地址
inc @dwCount1
invoke wsprintf, addr @bufTemp2, addr lpszFilterFmt4, @dwCount1
invoke lstrcat, addr lpServicesBuffer, addr @bufTemp2
dec @dwCount1

mov @dwCount, 0
invoke RtlZeroMemory, addr bufDisplay, 50
mov edi, offset bufDisplay
;为了能和后面的inc edi配合使edi正确定位到bufDisplay处
dec edi
.endif

dec totalSize
inc @dwCount
inc esi
inc edi
inc @dwCount1
.endw

;添加最后一行
invoke _appendInfo, addr lpServicesBuffer

;处理文件结束
jmp _ErrorExit
_ErrFormat:
invoke MessageBox, hWinMain, offset szErrFormat, NULL, MB_OK
_ErrorExit:
pop fs:[0]
add esp, 0ch
invoke UnmapViewOfFile, lpMemory
.endif
invoke CloseHandle, @hMapFile
.endif
invoke CloseHandle, @hFile
.endif
.endif
@@:
ret

_openFile endp
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
haoyeren 2013-03-05
  • 打赏
  • 举报
回复
我也有跟楼主同样的疑问,我在网上百度,搜到这个帖子了。不知道这个问题有定论了没有,我目前还没有进行反汇编调试,没有去看这个初始化会造成多大的影响,为什么执行的时候,对运行没有影响。而且我昨天也向作者发了邮件了,不知道能否得到作者的回复。我今天晚上进行反汇编,调试一下程序,看一下为什么没有对运行造成影响,按理说,这个初始化是不对的。
haoyeren 2013-03-05
  • 打赏
  • 举报
回复
我昨天给作者发邮件,没有收到回复,今天进行反汇编调试了一下,这两个变量@bufTemp1与@bufTemp2使用上,确实是有问题的,虽然也造成了一定的影响,但可能影响不是那么大,或是说,简单的操作,造成的影响并不能发现,具体情况说明如下: 经过我的反汇编,发现@stOF地址为EBP-4C,@hFile地址为EBP-50,@hMapFile地址为EBP-54,@bufTemp1地址为EBP-58,@bufTemp2地址为EBP-5B,对@bufTemp1按10个字节进行清零操作,会破坏掉变量@stOF的部分数据,以及@hFile与@hMapFile的全部数据。虽然变量@stOF在使用完了以后,就再也没有被使用了,不会造成什么影响,但是@hFile与@hMapFile可确是有用的,这个操作,会造成后面的CloseHandle传进去的句柄值不对,那么相应的资源就没办法被正常释放了。经过跟踪,发现错误的句柄值造成了CloseHandle的返回值为0,MSDN上查到,这个返回值为0,就表示有错误发生了,呵呵。 然后我按上面ProgrammingRing兄弟的方法,修改了程序,然后进行跟踪,发现CloseHandle的返回值为1了,MSDN上说只要是非零的值,就是成功了,呵呵,所以说,原来程序的写法,还是有问题的。我在想,如果不停地打开不同的文件,会不会造成占用的文件资源不被释放呢?不过这里是用线程在操作的,是不是线程退出,系统会回收资源,也不会造成什么问题呢,呵呵,这个就不做深入研究了,继续看Windows PE后面的内容
sjjwind 2012-08-02
  • 打赏
  • 举报
回复
我也在看这本书,请问你的_appendInfo这个是怎么写的,我对RichEdit这个控件不是很熟悉,自己写的有错误
WJN92 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
有问题吧,这两个只是申请了连个dword的局部变量啊,是不是应该是
local @bufTemp1[10]:byte
local @bufTemp2[20]:byte


我先试一下,这个代码是随书代码,编译运行似乎没遇到问题,不得其解
[/Quote]
这个好象是从栈分配内存的,可能这只是一个指针.你输出LIST看看
捕鲸叉 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
有问题吧,这两个只是申请了连个dword的局部变量啊,是不是应该是
local @bufTemp1[10]:byte
local @bufTemp2[20]:byte
[/Quote]

我先试一下,这个代码是随书代码,编译运行似乎没遇到问题,不得其解
ProgrammingRing 2012-06-23
  • 打赏
  • 举报
回复
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
有问题吧,这两个只是申请了连个dword的局部变量啊,是不是应该是
local @bufTemp1[10]:byte
local @bufTemp2[20]:byte
内容概要:本文围绕基于三重移相控制(TPS)的双有源桥(DAB)高频隔离DC-DC变换器开展系统性研究,重点构建了其在Simulink环境下的高精度仿真模型。研究全面涵盖SPS单相移相、DPS双重重移相与TPS三重移相等多种控制策略的建模、实现与性能对比,深入分析不同模式下变换器的功率传输特性、软开关实现条件及功率回流问题,旨在提升DAB在交直流混合微电网、能量路由器、多端口柔性互联装置等场景中的转换效率与动态响应能力。通过对ZVS(零电压切换)条件的精确控制与移相角参数的优化,有效降低了开关损耗,增强了系统整体能效与运行稳定性。该仿真模型具有良好的可扩展性,适用于复杂电能转换系统的科研验证与工程开发。; 适合人群:电力电子、电气工程及其自动化等相关专业的硕士研究生、博士生、科研人员以及从事新能源变换器、柔性输配电系统设计的工程技术人员。; 使用场景及目标:①掌握双有源桥DAB变换器的基本工作原理及其在高频隔离场合的核心优势;②深入理解三重移相控制策略的设计机理、控制自由度分配及其在效率优化中的关键作用;③构建并调试可用于科研论文撰写、项目申报或实际系统验证的高保真Simulink仿真模型,支撑理论分析与实验对比。; 阅读建议:建议结合MATLAB/Simulink平台进行动手实践,重点关注主电路拓扑搭建、移相控制模块设计、驱动信号时序配置及ZVS实现条件的仿真观测,推荐通过对比SPS、DPS与TPS三种模式的稳态与动态响应曲线,深入掌握各控制策略的适用边界与优化方向。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧