【问题标题】:How to create a new char array in NASM assembly using malloc如何使用 malloc 在 NASM 程序集中创建新的字符数组
【发布时间】:2016-03-09 23:20:26
【问题描述】:

鉴于此 c 代码:

char** names=(char**)malloc(count*sizeof(char*));

我想把它转换成 NASM 汇编代码。这是我尝试过的,但代码崩溃了:

  mov eax, dword count
  mov ebx, [eax*4] ;; i did times 4 because we clear stack by 4 bits or bytes?
  push ebx
  call _malloc
  mov names, eax
  add esp, 4

sizeof(char*)是什么意思?代码寻址的是哪个 char 指针?

【问题讨论】:

  • mov ebx, [eax*4] 应该是 lea ebx, [eax*4] 或只是 shl eax, 2; push eax。
  • 它不再崩溃了。但是 sizeof(char*) 是多少。我感觉不是 4。
  • @Jester 你应该把它作为答案发布!
  • sizeof(char *) 正在确定系统上指针的大小。如果您有 64 位系统,则可能是 8。

标签: c arrays pointers assembly nasm


【解决方案1】:

它崩溃的原因是因为mov ebx, [eax*4] 正在访问地址eax * 4 的内存,这不太可能是有效的,而且绝对不是你想要的。要乘以 4,您可以使用 lea ebx, [eax*4] 或 shl eax, 2 然后使用 push eax。

PS:学习使用调试器。

【讨论】:

  • 谢谢。这真的很有帮助
【解决方案2】:
sizeof (char *)

返回指针的大小:

  • 16 位 [2 字节] 用于 near(小型模型)指针
  • 32 位 [4 字节] 用于实模式下的 large 或 huge 模型,或 32 位虚拟模式下的指针
  • 64 位 [8 字节] 用于 64 位模式的指针。

【讨论】:

    【解决方案3】:

    了解更多有关它如何崩溃的信息会很有趣。在哪条指令上?

    回答你的问题sizeof(char *) 表示 any char * 的大小——它们的大小都是一样的。 32位指针4字节长,64位指针8字节长。

    代码没有取消引用sizeof() 内的任何指针。它在编译时进行评估,并产生存储char * 类型指针所需的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2016-02-23
      • 1970-01-01
      • 2021-03-24
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多