2012-06-05 1 views
5

Я в настоящее время работает над заданием в AT & T Ассамблеи, и теперь я должен добавить две строки:Добавляя две строки в сборке x86

message: .asciz "String 1" 
before: .asciz "String 2" 

Я действительно понятия не имею, как это сделать, или как начать. Я уже искал в Интернете, но я не мог найти полезной информации. Я думаю, что мне нужно вручную скопировать символы второй строки в конец первой строки, но я не уверен в этом.

Может ли кто-нибудь объяснить мне, как это сделать? :)

+0

Узел AT & T не существует, это просто другой синтаксис .. Наверное, вы подразумевали сборку x86, может быть? :) – BlackBear

+0

Вот что я имел в виду;) – Devos50

+0

Хорошо, я позволил вам отредактировать ваш квест :) – BlackBear

ответ

2

Это не мелочи. Строки имеют переменную длину и занимают разные пространства в памяти, и должен быть какой-то способ узнать, как долго они заканчиваются. С C или C++, nul байты (байты нулевого значения) указывают конец строки. С некоторыми другими языками программирования у вас есть указатель на начало строки и длину строки, хранящейся отдельно, что имеет преимущество, позволяя вам хранить двоичные файлы (включая байты нулевого значения) в строке. Даже с C и остальными вы должны иметь указатель на начало строки.

Что обычно должно произойти, так это то, что вы должны использовать asm для связи с операционной системой и запросить свободный в настоящее время блок памяти, который достаточно велик, чтобы содержать содержимое двух строк после их присоединения.Это будет память отдельно от любой из двух строк, начинающихся с одной из двух строк, и она исходит из того, что называется кучей памяти. После того, как вам задана начальная точка этого блока памяти, вы копируете содержимое первой строки в него вы продолжаете копировать содержимое второй строки в там, где находится первая. Затем вы отпускаете память, которая была назначена первой строке , и переназначить блок этой строке, изменив ее указатель и, возможно, его длину. Выпущенная память возвращается в кучу памяти операционной системой для повторного использования в другом месте.

Фактически, операционная система не является единственным источником освобожденной памяти. Некоторые компиляторы, даже сборщики, либо самостоятельно обрабатывают управление памятью, либо предоставляют подходящие инструменты программисту, чтобы сделать это по мере необходимости.

Другими словами, это может быть очень амбициозным начинанием, и вы должны знать достаточно о том, что происходит, чтобы сделать это правильно. Вы делаете это неправильно, вы можете ожидать последствий , например, сбой вашей системы и необходимость перезагрузки.

+0

Не знаете, как вы можете свернуть свою систему, выполнив программу, которая объединяет строки. – Simon

5

Этот вопрос не упоминает целевую память, что затрудняет ее реакцию. Я также не знаю, есть ли у вас 16 бит, 32 бит или 64 бит. Для удобства, я также просто предполагаю, что они являются строками с 0-концевым стилем.

Во всяком случае, это, кажется, общая процедура:

  • Получить длину первой строки (инструкции по написанию ассемблерный STRLEN можно найти здесь: http://www.int80h.org/strlen/)
  • Установите PTR к цели memory
  • Скопируйте первую строку в целевую память, используя rep(e/ne) movsb с размером в ecx.

Это может быть CPU-оптимизированная с помощью «MOVSD» сначала делает shr ecx, 2 от длины, чтобы получить его в партиях от 4 байта, а затем делать остаток с movsb. Я видел это сделано, как это:

mov  edi, dest 
mov  esi, string_address 
mov  ecx, string_length 
mov  eax, ecx 
shr  ecx, 2 
repne movsd 
mov  cl, al 
and  cl, 3 
repne movsb ; esi and edi move along the addresses as they copy, meaning they are already set correctly here 
  • Получить длину второй строки (не забудьте создать резервную копию EDI в стеке или другой регистр, если это необходимо, он содержит адрес, который вы должны скопировать next string to)
  • Скопируйте вторую строку в целевую память (как я сказал, правильный адрес должен быть в edi после первой операции строки)
  • Для обеспечения безопасности добавьте к нему новый 0.

Если вы копируете вторую строку в конец первой строки, вам нужно меньше одной операции копирования, но есть, чтобы убедиться, что есть на самом деле достаточно пространства там, чтобы скопировать вторую строку без перезаписи другие жизненно важные вещи.

 Смежные вопросы

  • Нет связанных вопросов^_^