Как манипулировать строками с помощью сборки x86? - PullRequest
1 голос
/ 10 сентября 2010

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

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

    SECTION .text

; do the concatenation

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

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

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

1 Ответ

3 голосов
/ 10 сентября 2010

Строки в вашем примере хранятся так же, как глобальный символьный массив будет храниться программой на Си. Это всего лишь серия байтов в разделе данных вашего исполняемого файла. Если вы хотите объединить их, вам понадобится некоторое пространство для этого - либо сделайте это в стеке, либо вызовите 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...