程序集信息:使用Visual Studio 2010编写嵌入到C
中的内联汇编您好, 我试图在C中写入一个字符数组,并试图模仿这个C代码的动作:
resNum[posNum3] = currNum3 + '0';
目前这就是我所拥有的:
mov ebx, posNum3;
mov resNum[ebx], edx; //edx is currNum3
add resNum[ebx], 48; // add 48 because thats the value of the char '0'
我也试过这样做:
mov ebx, posNum3;
mov eax, resNum[ebx] ;// eax points to the beggining of the string
mov eax, edx; // = currnum3
add eax, 48; // + '0'
没有任何运气,帮助不仅仅是赞赏!
答案 0 :(得分:2)
问题是指令
mov resNum[ebx], edx
将4个字节(整个双字)移动到目标,而不是单个字节。你可能想要
mov byte ptr resNum[ebx], dl
代替。虽然汇编程序允许你在地址上留下'size ptr'前缀,但你可能不想这样做,因为错误会导致很难看到错误。
答案 1 :(得分:0)
我的X86 asm生锈了,但...... 如果您正在使用字符(8位),首先需要先启动循环,将EAX归零,然后将char移动到AH或AL,例如:
; Before you start your loop xor EAX, EAX ; If you're sure you won't overflow an 8 bit number by adding 48, this can go outside the loop ; ... code here to setup loop mov EBX, posNum3 mov AL, resNum[EBX] add AL, 48 ; ... rest of loop
请注意,编译器会比你做得更好......除非你是Mike Abrash或像他这样的人:)
答案 2 :(得分:0)
避免使用
之类的表达式mov resNum[ebx], edx;
因为你永远不知道resNum
是什么。它可能是esp + 4
之类的表达式,mov [esp + ebx + 4], edx
没有操作码,因此请使用小步骤。
此外,ebx
是一个必须在调用中保留的寄存器。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/k1a8ss06%28v=VS.71%29.aspx,了解调用约定。
答案 3 :(得分:0)
大多数内联汇编程序允许使用name
代替size ptr [name]
,因此您只需编写
mov al, currNum3
add al, 0x30 //'0'
mov edx, posNum3
mov ecx, resNum
mov byte ptr [edx+ecx], al
如果resNum是全局数组,而不是函数参数或局部变量,则可以编写更短的代码:
mov al, currNum3
add al, 0x30 //'0'
mov edx, posNum3
mov byte ptr [resNum+ecx], al