Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 为什么我的程序有时从未完全退出_Winapi_Assembly_X86_X86 64_Masm - Fatal编程技术网

Winapi 为什么我的程序有时从未完全退出

Winapi 为什么我的程序有时从未完全退出,winapi,assembly,x86,x86-64,masm,Winapi,Assembly,X86,X86 64,Masm,我创建了一个简单的汇编程序,获取屏幕的DC,然后释放屏幕的DC,每隔一段时间(大约1/4的时间,有时更少,有时更多,但平均1/4)程序不会结束,当我尝试中断所有程序时,它不会显示正在执行的代码,我不知道为什么会发生这种情况,也不知道如何解决 我在VisualStudio上运行的代码,masm汇编程序 includelib user32.lib include externals.asm .data .code start proc xor rcx, rcx getdcfail:

我创建了一个简单的汇编程序,获取屏幕的DC,然后释放屏幕的DC,每隔一段时间(大约1/4的时间,有时更少,有时更多,但平均1/4)程序不会结束,当我尝试中断所有程序时,它不会显示正在执行的代码,我不知道为什么会发生这种情况,也不知道如何解决

我在VisualStudio上运行的代码,masm汇编程序

includelib user32.lib
include externals.asm
.data
.code
start proc
    xor rcx, rcx
getdcfail:
    call GetDC
    cmp rax, 0
    je getdcfail
    mov r12, rax
releasedcfail:
    mov rdx, r12
    xor rcx, rcx
    call ReleaseDC
    cmp rax, 0
    je releasedcfail
    ret
start endp
end
这里是externals.asm

extrn GetDC:proc
extrn ReleaseDC:proc
extrn GetDesktopWindow:proc

可能不是你的问题,但是当
ReleaseDC
失败时,你跳到
getdcfail:
有什么原因吗?这是一个输入错误我尝试了很多东西,这就是为什么getdesktopwindow是外部的一部分,我看看这是否是我的问题当你用调试器连接到卡住的进程时,RIP在哪里?它是在无限循环中还是在系统调用中被阻塞?如果调试器没有向您显示,请尝试其他调试器。或者可能只是在调试器外部启动程序,并在程序卡住后附加到它?您没有为32字节的传出参数空间分配任何空间,而不管您传递的参数数量如何,这些空间总是必需的。您也不会将堆栈对齐到所需的16字节对齐方式。前一个问题可能导致调用的函数在调用函数时破坏存储在堆栈上的返回地址。@NathanielSmith-它进行优化。因为导入是如何工作的-您可以通过变量
\uu imp\u apiname
进行间接调用。这个变量由lib文件(kernel32.lib、User32.lib等)实现。当您为导入的函数调用fn时,链接器需要创建存根
fn:jmp\uu imp\u fn
,并且您实际调用了此存根。最好直接做
呼叫\uuu imp\u fn
。但是main-您必须
调用\uu imp\u ExitProcess
并且您的2个循环没有意义。如果失败
ReleaseDC
-顺序调用当然也会失败