【问题标题】:FASM assembly program waits before exitingFASM 汇编程序在退出前等待
【发布时间】:2018-11-05 01:09:36
【问题描述】:

这是我与 FASM 一起使用的代码:

format PE console
entry main

include '..\MACRO\import32.inc'

section '.data' data readable writeable
msg db "привіт!",0dh,0ah,0 ;hi
lcl_set db ?

section '.code' code readable executable
main:
;fail without set locale
push    msg
call    [printf]
 pop    ecx

;succeed with set locale
push msg
call _liapnuty
pop ecx

push 0
call [ExitProcess]

_liapnuty:
push    ebp
 mov    ebp, esp
;sub    esp, 0
 mov    ebx,[ebp+8]  ; 1st arg addr

 mov    al, [lcl_set]
  or    al, al
 jnz    _liapnuty_rest
call    __set_locale

_liapnuty_rest:
push    ebx
call    [printf]
 pop    ebx

 mov    esp, ebp
 pop    ebp
 ret    0

__set_locale:
 mov    al, [lcl_set]
  or    al, al
 jnz    __set_locale_rest

push    1251
call    SetConsoleCP
call    SetConsoleOutputCP
 pop    ecx
 mov    [lcl_set], 1

;push   lcl
;call   [system]
; pop   ecx
; mov   [lcl_set], 1

;push   cls
;call   [printf]
; pop   ecx

__set_locale_rest:
 ret    0


section '.idata' import data readable
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'

import  kernel,\
        SetConsoleCP,'SetConsoleCP',\
        SetConsoleOutputCP,'SetConsoleOutputCP',\
        ExitProcess,'ExitProcess'

import  msvcrt,\
        printf,'printf'

它几乎可以完美运行,只是在退出之前它出于某种原因等待了一秒钟。它几乎立即输出数据,但无法快速关闭。如果原因是使用这些库或在调用 ExitProcess 后没有清除堆栈(这显然无法完成),那么请告诉我,我很乐意接受这个答案,但我想 100% 确定我正在做一切正常。

【问题讨论】:

  • 您是否尝试过在分析工具下运行您的代码以查看它在哪里花费时间?它可能会崩溃而不是干净地退出吗?
  • 谢谢你的想法,这实际上是正确的!

标签: windows winapi assembly fasm


【解决方案1】:

所有这一切的原因是因为 kernel32 函数在返回时会弹出它们的参数。如果我删除不必要的弹出,它会再次开始快速工作。当然,程序仍然在堆栈损坏的情况下运行,但最后它做了很多损坏控制。这就是为什么它很慢,但仍然有效。对于遇到此问题的每个人,请务必注意调用约定。

为了调试应用程序并找到我使用 OLLYDBG 的错误。它是免费的并且有效。它可以帮助您调试 EXE 和 DLL,允许一次执行一个命令。它还显示了内存、堆栈以及所有的寄存器和标志。

使用堆栈,我发现它已损坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多