社区
汇编语言
帖子详情
如何禁止masm优化?
TaiJi1985
2006-04-05 11:04:56
我将一个vc程序和一个masm编写的汇编程序 连接后,用vc跟踪反汇编代码。
发现用masm32编译的汇编代码被弄得乱七八糟了。masm是不是默认优化代码啊?
如何关闭优化呢?
谢谢!
...全文
236
4
打赏
收藏
如何禁止masm优化?
我将一个vc程序和一个masm编写的汇编程序 连接后,用vc跟踪反汇编代码。 发现用masm32编译的汇编代码被弄得乱七八糟了。masm是不是默认优化代码啊? 如何关闭优化呢? 谢谢!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
TaiJi1985
2006-06-08
打赏
举报
回复
问题已经解决,谢谢各位捧场,给分!
TaiJi1985
2006-04-08
打赏
举报
回复
晕死,我过了一天后,又调发现没有问题了,一个问题又隐藏了起来了。
现在把源代码贴出来。
----------
这是一个进程切换的函数,寄存器的切换
.386
.model flat
.data
newthread dd 0
oldthread dd 0
save_eax dd 0
save_ebx dd 0
.code
;;;;const ;;;;;;;;
REG_SAVESIZE equ 8
REG_EAX equ 0
REG_EBX equ 4
REG_ECX equ 8
REG_EDX equ 12
REG_ESP equ 16
REG_EBP equ 20
REG_ESI equ 24
REG_EDI equ 28
START_PROC equ 32
;;;;;end const ;;;;;
; esp + 4 old
; esp + 8 new
; c: SWITCH(old,new)
;
;;;;;;;;;;;;;;;;;;;
_SWITCH proc
mov save_eax,eax ;;save eax
mov eax,[esp+4] ;; mov address of old thread to eax
mov oldthread,eax ;; mov address of old thread to val oldthread
mov [eax+REG_EBX],ebx
mov [eax+REG_ECX],ecx
mov [eax+REG_EDX],edx
mov ebx,[esp] ; ret address! ,save to bx
mov [eax+START_PROC],ebx ;;[esp] contain ret address!,save it!
mov [eax+REG_ESP],esp ;;
mov [eax+REG_EBP],ebp
mov [eax+REG_ESI],esi
mov [eax+REG_EDI],edi
mov eax,save_eax ;; recover eax
mov [esp+4],eax ;; save eax
;;set reg
mov eax,[esp+8] ;; mov address of new thread to eax
mov newthread,eax ;; mov address of new thread to val new thread
mov ebx,REG_EBX[eax]
mov ecx,REG_ECX[eax]
mov edx,REG_EDX[eax]
mov esp,REG_ESP[eax]
mov ebp,REG_EBP[eax]
mov esi,REG_ESI[eax]
mov edi,REG_EDI[eax];;
mov save_eax,eax ;;save eax
mov eax,START_PROC[eax] ;return address
mov [esp],eax ;set return address
mov eax,save_eax ;;recover eax
mov eax,REG_EAX[eax]
ret
_SWITCH endp
end
-------------------------------
原先,写的是
.386
.model flat
.data
newthread dd 0
oldthread dd 0
save_eax dd 0
save_ebx dd 0
.code
;;;;const ;;;;;;;;
REG_SAVESIZE equ 8
REG_EAX equ 0
REG_EBX equ 4
REG_ECX equ 8
REG_EDX equ 12
REG_ESP equ 16
REG_EBP equ 20
REG_ESI equ 24
REG_EDI equ 28
START_PROC equ 32
;;;;;end const ;;;;;
; esp + 4 old
; esp + 8 new
; c: SWITCH(old,new)
;
;;;;;;;;;;;;;;;;;;;
_SWITCH proc
mov save_eax,eax ;;save eax
mov eax,[esp+4] ;; mov address of old thread to eax
mov oldthread,eax ;; mov address of old thread to val oldthread
mov REG_EBX[eax],ebx
mov REG_ECX[eax],ecx
mov REG_EDX[eax],edx
mov ebx,[esp] ; ret address! ,save to bx
mov START_PROC[eax],ebx ;;[esp] contain ret address!,save it!
mov REG_ESP[eax],esp ;;
mov REG_EBP[eax],ebp
mov REG_ESI[eax],esi
mov REG_EDI[eax],edi
mov eax,save_eax ;; recover eax
mov [esp+4],eax ;; save eax
;;set reg
mov eax,[esp+8] ;; mov address of new thread to eax
mov newthread,eax ;; mov address of new thread to val new thread
mov ebx,REG_EBX[eax]
mov ecx,REG_ECX[eax]
mov edx,REG_EDX[eax]
mov esp,REG_ESP[eax]
mov ebp,REG_EBP[eax]
mov esi,REG_ESI[eax]
mov edi,REG_EDI[eax];;
mov save_eax,eax ;;save eax
mov eax,START_PROC[eax] ;return address
mov [esp],eax ;set return address
mov eax,save_eax ;;recover eax
mov eax,REG_EAX[eax]
ret
_SWITCH endp
end
fhb13
2006-04-05
打赏
举报
回复
你是不是用了宏汇编指令?
建议你用存汇编试试。
大熊猫侯佩
2006-04-05
打赏
举报
回复
masm 源代码贴出来。
Windows逆向工程入门之
MASM
等号伪指令(= & EQU)
。
Win32汇编笔记-程序框架
基本概念 Win16 内存模式下,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此"看"到别的程序的内容,这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。 每一个Win32 应用程序,放到分开的虚拟地址空间(相互独立的 4GB 地址空间)中去运行,当然这倒不是说它们都拥有 4GB 的物理地址空间,而只是说能够在 4GB 的范围内寻址。操作系统将会在...
从-O0到-O3:深度解析GCC/Clang编译器
优化
等级与实战技巧
编译器
优化
是现代编程中提升程序性能的核心技术,其原理在于通过一系列自动化代码转换,在保证程序行为不变的前提下,提升执行效率并减少资源占用。这项技术的价值在于它能将高级语言代码高效映射到底层硬件指令,是连接算法设计与实际执行性能的关键桥梁。在工程实践中,
优化
技术广泛应用于高性能计算、嵌入式系统、游戏引擎及实时数据处理等对性能敏感的场景。本文聚焦于GCC/Clang编译器
优化
等级,深入剖析从-O0到-O3各级别的差异与适用场景,并结合循环展开和自动向量化等热词技术,探讨如何编写对编译器友好的代码以充分发挥硬件潜
C++ volatile关键字深度解析:编译器
优化
与硬件交互的正确姿势
在计算机系统中,编译器
优化
是提升程序性能的关键技术,通过消除冗余代码、重排指令顺序等手段生成高效机器码。然而,当程序需要与外部硬件设备交互时,这种
优化
可能导致严重问题——编译器无法感知硬件寄存器的异步变化。volatile关键字正是为解决这一矛盾而生,它强制编译器每次访问变量时都直接从内存读取或写入,确保硬件交互的正确性。在嵌入式开发、设备驱动等场景中,volatile是连接软件与硬件的桥梁,但需注意它并非线程同步工具,多线程场景应使用atomic类型。本文通过内存映射I/O、信号处理等实例,详解volat
编译时内存排序
在您键入一些 C/C++ 源代码和它在 CPU 上执行代码的时间之间,这些代码的内存交互可能会根据某些规则重新排序。内存排序的更改由编译器(在编译时)和处理器(在运行时)进行,目的都是让您的代码运行得更快。编译器开发人员和 CPU 供应商普遍遵循的内存重排序基本规则可以表述如下:不应修改单线程程序的行为。由于这条规则,编写单线程代码的程序员基本上不会注意到内存重新排序【memory reordering】。
汇编语言
21,500
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章