小编CMi*_*lby的帖子

在函数中更改数组值 - 内联汇编

所以我在一段时间后自学了x86程序集,只是在C++中使用内联汇编.

所以我想做的是在函数参数,传入数组,索引(unsigned int)和数字.使用程序集,它会将数组的内存位置中的值更改为传入的值.所以代码看起来像这样.

inline void Set( int pArray[], unsigned int pIndex, int pNum ) {
    __asm {
        mov ebx, pIndex
        mov eax, 4
        mul ebx
        mov ebx, pNum

        lea edi, pArray
        mov [ edi + eax ], ebx
    }
}

int main() {
    int myArray[ 5 ] = { 1, 2, 3, 4, 5 };
    Set( myArray, 2, 7 );
    std::cout << myArray[ 2 ] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

所以代码应该加载数组地址的开头,获取索引并将其乘以4,以便内存位置移动那么多字节,然后将其更改为传入的值.但是,当我这样做时,值保持不变.这是为什么?出了什么问题?

c++ arrays x86 assembly inline-assembly

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

在x86程序集中声明数组

我正在学习装配,我需要制作一个大型阵列.我已经看过如何声明数组,我遇到过这个问题.

array db 10 dup(?)
Run Code Online (Sandbox Code Playgroud)

声明了10个未初始化字节的数组.我尝试了这个并尝试组装它并获得"错误:操作数1后预期的逗号".我意识到'?' 在x86中不支持,因此我将其设为常量并得到了相同的错误.我最终这样做了.

array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Run Code Online (Sandbox Code Playgroud)

这有效!但问题是,我需要大型数组(~100-400整数),并且它们的值并不总是已知.我可以写出400 0,但我认为必须有一个更简单的方法.那么有更好的方法来声明大型数组吗?

我在具有AT&T语法的基于Intel的Macbook Pro上使用x86_64汇编.

arrays x86 assembly

6
推荐指数
2
解决办法
2万
查看次数

SpriteKit - 确定A方碰撞的A方

所以对于我正在研究的App,我有两个立方体碰撞.我以标准方式检查这个.该应用程序告诉我他们何时在我的"didBeginContact"方法中发生碰撞.

-(void)didBeginContact:(SKPhysicsContact *)contact {
    if (contact.bodyA.categoryBitMask == WALL_CATEGORY && contact.bodyB.categoryBitMask == CHARACTER_CATEGORY) {
        CGPoint point = contact.contactPoint;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我知道碰撞发生在哪里,但因为它是两个正方形,它可以在包括角落在内的任何一点.那么我该如何检查左/右/上/下的碰撞?

编辑:正确答案:可能不是最干净的方法,但它的工作原理.希望它能帮助将来的某个人.

m_lNode = [SKNode node];
m_lNode.position = CGPointMake(-(CHARACTER_SIZE / 2), 0);
m_lNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1, m_character.size.height)];
m_lNode.physicsBody.allowsRotation = NO;
m_lNode.physicsBody.usesPreciseCollisionDetection = YES;
m_lNode.physicsBody.categoryBitMask = CHARACTER_L_CATEGORY;

m_rNode = [SKNode node];
m_rNode.position = CGPointMake((CHARACTER_SIZE / 2), 0);
m_rNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1, m_character.size.height)];
m_rNode.physicsBody.allowsRotation = NO;
m_rNode.physicsBody.usesPreciseCollisionDetection = YES;
m_rNode.physicsBody.categoryBitMask = CHARACTER_R_CATEGORY;

m_tNode = [SKNode node];
m_tNode.position = CGPointMake(0, (CHARACTER_SIZE / 2)); …
Run Code Online (Sandbox Code Playgroud)

collision-detection sprite ios

5
推荐指数
1
解决办法
882
查看次数

C++ std :: vector作为std :: function的参数

我试图用C++进行回调.回调的参数是通过引用传递的向量.问题是当我调用函数时,向量总是为空.要证明这一点,请参阅下面的程序.

struct TestStruct {
    int x;
    int y;
};

void TestFunction( const std::vector<TestStruct> &vect ) {
    for ( unsigned int i = 0; i < vect.size(); i++ ) {
        printf( "%i, %i\n", vect[ i ].x, vect[ i ].y );
    }
}

int main() {
    std::map<std::string, std::function<void( const std::vector<TestStruct>& )>> map;

    std::vector<TestStruct> vect;
    map[ "test1" ] = std::bind( &TestFunction, vect );
    map[ "test2" ] = std::bind( &TestFunction, vect );

    std::vector<TestStruct> params;
    TestStruct t;
    t.x = 1;
    t.y = 2;
    params.emplace_back( t …
Run Code Online (Sandbox Code Playgroud)

c++ function vector

0
推荐指数
1
解决办法
370
查看次数