返回介绍

30.2 例子#2

发布于 2025-02-22 14:00:50 字数 954 浏览 0 评论 0 收藏 0

#include <windows.h>
int PASCAL WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
    MessageBox (NULL, "hello, world", "caption", MB_YESNOCANCEL);
    return 0;
};

WinMain proc near
        push bp
        mov bp, sp
        xor ax, ax ; NULL
        push ax
        push ds
        mov ax, offset aHelloWorld ; 0x18\. "hello, world"
        push ax
        push ds
        mov ax, offset aCaption ; 0x10\. "caption"
        push ax
        mov ax, 3 ; MB_YESNOCANCEL
        push ax
        call MESSAGEBOX
        xor ax, ax ; return 0
        pop bp
        retn 0Ah
WinMain endp
dseg02:0010 aCaption db ’caption’,0
dseg02:0018 aHelloWorld db ’hello, world’,0

有两个重要的信息:PASCAL 调用转换表明先传递最后的参数(MB_YESNOCANCEL),然后才是第一个参数 NULL。这个调用也表明了调用者恢复栈指针:因为 RETN 有一个 0Ah 的参数,这个意味着栈指针将在函数退出时上移 10 个字节。 指针按对传递:一组数据先传递,指针就在这组数据里面。例子这里只有一组数据,所以 DS 永远指向可执行文件的 data 段。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文