LINUX.ORG.RU

.equ '\0' это то же, что .equ '0'

 ,


0

1

В обоих случаях objdump -d test.s покажет вам 0x30 (ascii для числового представления текста ‘0’). Вопрос: это баг или фича?

  401010:	3c 30                	cmp    $0x30,%al

Предположительно - это баг, т.к. .equ ‘\n’ - это 0xa:

Disassembly of section .text:

0000000000000000 <_start>:
   0:	48 c7 c1 30 00 00 00 	mov    $0x30,%rcx
   7:	48 c7 c7 30 00 00 00 	mov    $0x30,%rdi
   e:	48 c7 c0 0a 00 00 00 	mov    $0xa,%rax
  15:	48 c7 c0 3c 00 00 00 	mov    $0x3c,%rax
  1c:	0f 05                	syscall

сорс:

.equ NOL, '0'
.equ NUL, '\0'
.equ ABZAC, '\n'

.section .text
.globl _start
_start:
  movq $NOL, %rcx
  movq $NUL, %rdi
  movq $ABZAC, %rax
  movq $60, %rax
  syscall


Последнее исправление: P0085 (всего исправлений: 3)
Ответ на: комментарий от anonymous

помогло:

.equ NOL, '0'
.equ NUL, "\0"
.equ ABZAC, '\n'

.section .text
.globl _start
_start:
  movq $NOL, %rcx
  movq $NUL, %rdi
  movq $ABZAC, %rax
  movq $60, %rax
  syscall

вывод компиляции:

tmp.s: Assembler messages:
tmp.s:2: Warning: '\0' in quoted symbol name; behavior may change in the future

результат:

Disassembly of section .text:

0000000000000000 <_start>:
   0:	48 c7 c1 30 00 00 00 	mov    $0x30,%rcx
   7:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
   e:	48 c7 c0 0a 00 00 00 	mov    $0xa,%rax
  15:	48 c7 c0 3c 00 00 00 	mov    $0x3c,%rax
  1c:	0f 05                	syscall
P0085
() автор топика
Ответ на: комментарий от P0085

в документации сказано что https://ftp.gnu.org/old-gnu/Manuals/gas/html_chapter/as_3.html

Constants
A constant is a number, written so that its value is known by inspection, without knowing any context. Like this:

.byte  74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value.
Strings
A string is written between double-quotes. It may contain double-quotes or null characters. The way to get special characters into a string is to escape these characters: precede them with a backslash `\' character. For example `\\' represents one backslash: the first \ is an escape which tells as to interpret the second character literally as a backslash (which prevents as from recognizing the second \ as an escape character). The complete list of escapes follows.


\b
Mnemonic for backspace; for ASCII this is octal code 010.
\f
Mnemonic for FormFeed; for ASCII this is octal code 014.
\n
Mnemonic for newline; for ASCII this is octal code 012.

Надо еще ABZAC ’\n поменять, сейчас 0x3c это буква n получается

anonymous
()

Во-первых, какой смысл писать '\0', если то же самое занимает в 4 раза меньше букв цифрой 0? Во-вторых, немного не по теме, но рекомендую не привыкать к наркоманскому AT&T-синтаксису и переключиться на интеловский, или найти ассемблер который дефолтно его поддерживает.

firkax ★★★★★
()

А если '\x00'? Есть предположение, что он просто не воспринимает escape последовательность.

А вообще, я предполагаю, что GNU As не очень предназначен для использования людьми, скорее для компиляции выхлопа gcc -S. Поэтому конструкции не типичные для gcc плохо оттестированы. А для людей есть другие ассемблеры - nasm, fasm и т. д.

KivApple ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария