Строка в сборке

#string #assembly

#строка #сборка

Вопрос:

Что делает .string в сборке?

Во встроенном вызове asm на c я написал

 .string "Hello World"
  

1) Может кто-нибудь дать мне обзор того, как работает .string?

2) Каким-то образом это значение сохраняется в%esi. Почему?

3) Как я могу добавить каретку возврата в конце? n не работает

Комментарии:

1. Какой ассемблер вы используете? ГАЗ?

2. ДА. Ну, моя ОС — x86 linux, и я пишу сборку с asm на c и компилирую в gcc, так что это GAS, верно?

3. Это звучит как какая-то проблема с кавычками / экранированием, поэтому нам нужно просмотреть окружающий код.

Ответ №1:

.string является директивой ассемблера в GAS , аналогичной .long , .int , или .byte . Все, что он делает, это создает и инициализирует память для использования в вашей программе. .string Директива автоматически завершит строку нулевым [] значением для вас. В этом случае ассемблер выделяет пространство для 14 символов в 14 непрерывных байтах памяти. Если бы вы посмотрели на память, вы бы увидели это:

 ["][H][e][l][l][o][ ][W][o][r][l][d]["][]
  

За исключением шестнадцатеричных, а не символов. Я не уверен, как и почему %esi указывает на строку (это либо параметр ассемблера, с которым я не знаком, либо он был установлен таким образом в строке кода, которую вы нам не показываете). Это означает, что %esi «указывает» на первый байт строки — в данном случае первый ["] . Вы можете использовать %esi регистр для перебора байтов, используя смещение ( %esi 5 было бы [o] ) или увеличивая сам регистр.

Чтобы добавить новую строку, вы можете попробовать x0Dx0A вместо n .

Ответ №2:

  1. Он просто выдает последовательность символов в соответствующий раздел кода / данных. Посмотрите это и это (хотя они используют .ascii ).
  2. Покажите нам код.
  3. Попробуйте \n или 12 или xa.