【发布时间】: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