【问题标题】:Write data to a char using Assembly使用 Assembly 将数据写入 char
【发布时间】:2012-05-03 21:02:05
【问题描述】:

我用 C 语言创建了一个程序来生成一个 char* 处理数据。 我发送到我的汇编程序并将其放入寄存器中:

mov     edx, [ebp+12]
mov     edi, edx

我怎样才能在其中写入一个字符。 我知道我需要 在循环中编写一个 char 和 inc edi...。 但是我怎么能写一个字符,我已经把这个值放到另一个寄存器中了。 但是如果我做 mov edx, 49;字符代码我会丢失指针。 我想做类似的事情

for(p=malloc(100*sizeof(char*)); p!=NULL;p++){
    *p=//my char code
}

适用于 linux (DEBIAN) x86 的程序集

【问题讨论】:

  • 那么,使用 AL 吗?如果需要,只需按 EAX 并在之后弹出它。你真的应该阅读英特尔寄存器架构和汇编指令。
  • 这个问题对我来说很不清楚。 “我的字符代码”应该是什么?
  • 如果我输入 49 我必须收到 '1'

标签: assembly


【解决方案1】:

edx 是字符的目标地址。也就是说,edx 是指向您要写入的位置的指针。因此,请执行以下操作:

mov byte ptr ds:[edx], 49

这甚至可能有效:

mov byte ptr ds:[edx], '1'

你说你的角色已经在某个寄存器中。我假设它是一个 8 位寄存器 (ah/al/bh/bl/ch/cl/dh/dl),在这种情况下你可以这样做:

mov [edx], ah

在这种情况下,汇编器可以推断出[edx] 所指向的数据的大小。


我现在在 Windows 上,所以这段代码适用于 VC++。它演示了复制字符串:

#include <stdlib.h>
#include <stdio.h>

char src[] = "hello";
char dest[8];

int main( void )
{
   __asm
   {
      xor ecx, ecx

      mov eax, offset src
      mov edx, offset dest

        loop_dest:

      mov bh, byte ptr ds:[eax+ecx]
      mov [edx+ecx], bh

      inc ecx
      cmp ecx, size src
      jnz loop_dest
   }

   printf("%s\n", dest);
   return EXIT_SUCCESS;
}

如果您的汇编器使用 AT&T 语法,您需要做一些小的翻译,但希望这会为您指明正确的方向。

【讨论】:

  • 我这样做了,可能我误解了如何使用它,我试图复制和粘贴 XD 和 mov byte[edx], 49.. 不走运
  • 我正在使用 ebx,可能是一个错误,我有 2 个指针.. 来源和命运。我使用asm处理数据,第一个指针是ebx第二个(进程)是edx。我可以做 mov [edx], ebx 吗?
  • 如果我做 mov [edx], ebx 程序停止并且不运行 XD。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多