X86内联汇编,写入C数组

时间:2010-10-31 18:31:44

标签: arrays visual-studio-2010 assembly x86 inline-assembly

程序集信息:使用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'

没有任何运气,帮助不仅仅是赞赏!

4 个答案:

答案 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