Как манипулировать строками с помощью сборки x86?

Я нахожусь в процессе написания программы сборки, которая принимает две строки в качестве входных данных и объединяет их. Вот что у меня есть: (с использованием синтаксиса NASM)

    SECTION .data
hello:  db "Hello ",0
world:  db "world!",0

    SECTION .text

; do the concatenation

Поскольку я никогда раньше не работал со строками в ассемблере x86, мне нужно знать, как работает хранение строк и управление ими.

Я предполагаю, что после того, как длина каждой строки станет известна, эта конкатенация будет просто включать перемещение фрагментов памяти. Эту часть можно упростить, используя libc. (Я могу использовать strlen() и strcat().)

Моя настоящая проблема в том, что я не знаком с тем, как строки хранятся в сборке x86. Они просто добавляются в стек...? Они куда-то кучкой идут? Должен ли я использовать malloc() (как-то)?


person Nathan Osman    schedule 10.09.2010    source источник


Ответы (1)


Строки в вашем примере хранятся так же, как глобальный массив символов хранится в программе C. Это просто последовательность байтов в разделе данных вашего исполняемого файла. Если вы хотите объединить их, вам понадобится некоторое пространство для этого - либо сделайте это в стеке, либо вызовите malloc(), чтобы получить немного памяти. Как вы сказали, вы можете просто использовать strcat(), если хотите позвать libc. Вот быстрый пример, который я сделал (синтаксис AT&T), используя глобальный буфер для объединения строк, а затем распечатывая их:

  .data
hello:
  .asciz "Hello "
world:
  .asciz "world!"
buffer:
  .space 100

  .text
  .globl _main
  .globl _puts
  .globl _strcat

_main:
  push  %rbp
  mov   %rsp, %rbp
  leaq  buffer(%rip), %rdi
  leaq  hello(%rip), %rsi
  callq _strcat
  leaq  buffer(%rip), %rdi
  leaq  world(%rip), %rsi
  callq _strcat
  leaq  buffer(%rip), %rdi
  callq _puts
  mov   $0, %rax
  pop   %rbp
  retq
person Carl Norum    schedule 10.09.2010
comment
Однако является ли использование malloc() хорошим решением? Будут ли негативные последствия от его использования? (Очевидно, что после этого забывают освободить память.) - person Nathan Osman; 10.09.2010
comment
@ Джордж, использование malloc() не влечет за собой никаких других последствий, которых не было бы в программе на C. - person Carl Norum; 10.09.2010
comment
Наконец-то я реализовал это в своем компиляторе - отлично работает! Спасибо! - person Nathan Osman; 10.09.2010