所以我在一段时间后自学了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,以便内存位置移动那么多字节,然后将其更改为传入的值.但是,当我这样做时,值保持不变.这是为什么?出了什么问题?
我正在学习装配,我需要制作一个大型阵列.我已经看过如何声明数组,我遇到过这个问题.
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汇编.
所以对于我正在研究的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) 我试图用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)