#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
.