繁体   English   中英

X86内联汇编,写入C数组

[英]X86 inline assembly, writing into C array

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

没有任何运气,帮助不胜感激!

问题是指令

mov resNum[ebx], edx

将4个字节(整个dword)移入目标,而不是单个字节。 你可能想要

mov byte ptr resNum[ebx], dl

代替。 虽然汇编程序将允许您在地址上保留“ size ptr”前缀,但您可能不希望这样做,因为输入错误会导致难以发现的错误。

我的X86组件生锈了,但是...如果使用字符(8位),则需要首先在开始循环之前将EAX清零,然后将字符移到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或像他一样的人:)

避免使用类似

mov resNum[ebx], edx;

因为你永远不知道什么是resNum 它可能是类似esp + 4的表达式,并且没有mov [esp + ebx + 4], edx操作码,因此请改用小步。

此外, ebx是一个必须在调用之间保留的寄存器。 有关详细信息,请参见http://msdn.microsoft.com/zh-cn/library/k1a8ss06%28v=VS.71%29.aspx ,并了解有关调用约定的信息。

大多数内联汇编程序允许使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM