小编ser*_*ncu的帖子

x86程序集:通过堆栈将参数传递给函数

我正在尝试在程序集中创建一个子程序,它将在屏幕上绘制一个正方形.我不认为我可以像在C++中那样将参数传递给子程序,所以我想我可以使用堆栈来存储和访问参数(我不能使用公共数据寄存器,因为有太多变量到通过).

问题是(我记得在某处阅读)当我使用call命令到当前"程序"的地址时,它被保存在堆栈中,因此当它使用"ret"命令时它将知道返回的位置.但是,如果我存储在堆栈上的东西,然后调用函数,我必须保存在某个地方的地址(也就是在堆栈的顶部),然后安全地弹出的参数.然后在代码完成之后并且在调用"ret"之前,我将不得不推回地址.

我对吗?并且,如果是,我在哪里可以存储地址(我不认为地址只有1个字节长,因此它适合AX或BX或任何其他数据寄存器).我可以使用IP来执行此操作(虽然我知道这用于其他事情)?

这就是我的想象:

[BITS 16]
....
main:
  mov ax,100b
  push ax
  call rectangle ;??--pushes on the stack the current address?

jml $

rectangle:
  pop ax ;??--this is the addres of main right(where the call was made)?
  pop bx ;??--this is the real 100b, right?
  ....
  push ax
ret ;-uses the address saved in stack
Run Code Online (Sandbox Code Playgroud)

x86 assembly cpu-registers x86-16

7
推荐指数
1
解决办法
1万
查看次数

了解GetDiBits.C++

MSDN表示GetDiBits在调用此函数之前,不应将用于的位图选择为DC.但是从我的经验来看,BitBlt我知道除非选择了位图,否则我无法绘制位图.

  1. 怎么GetDiBits绕过这个?我可以使用未选择的,新创建的位图作为此函数的参数吗?
  2. GetDiBitsCreateDibSection返回一个数组.但是MSDN谈到了第一个功能:

    "指定的兼容位图的位"

    我认为DI代表DeviceIndependent.为什么会出现矛盾?这意味着,根据MSDN,GetDiBits只能用CreateCompatibleBitmap(哪个是DD)?然后我不能将这个数组发送到另一台机器来显示它,对吗?

  3. 这两个函数都使用hDC.如果CreateDibSection真的是DIndependent为什么它需要一个hDC?所有需要的信息都是通过bitmapinfoheader提供的......

winapi dib getdibits createdibsection

2
推荐指数
1
解决办法
186
查看次数

使用未初始化的成员返回内联定义的结构.C++

这些问题在论坛中得到的关注太少.

之前有人问过,但没有人抓住这个小细节.结果我不确定我做的是否正确:

简单的例子:

struct TEST {
    bool a;
    int b;
};

TEST func() {
    return { false };
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?请注意,int值未初始化.虽然将其设置为0不会有问题,但会出现更多问题:

struct _FILE_MUTEX {
    bool locked;
    HANDLE handle;
};
Run Code Online (Sandbox Code Playgroud)

从向量,数组到函数指针,结构的最后一个成员可能变得越来越复杂.

返回内联初始化结构时,我可以将一些成员留空吗?

c++ struct c++17

2
推荐指数
1
解决办法
107
查看次数