Зачем мне нужен оператор смещения?

Привет, мне пришлось написать сборку AT&T x86 для сборки Intel.

.section .data

str:    .ascii  "Hello world!\n"
    strlen = . - str

num:    .long   1337

.section .text

.global _start

_start:
    movl    $4, %eax
    movl    $1, %ebx
    movl    $str, %ecx
    movl    $strlen, %edx
    int $0x80

    movl    $1, %eax
    movl    $0, %ebx
    int $0x80

Это АТ&Т

.intel_syntax noprefix
.section .data

str:    .ascii  "Hello world!\n"
    strlen = . - str

num:    .long   1337

.section .text

.global _start

_start:
    mov eax, 4 
    mov ebx, 1
    mov ecx, offset str
    mov edx, strlen
    int 0x80

    mov eax, 1 
    mov ebx, 0
    int 0x80

Зачем мне это смещение. Я нашел это в другом вопросе о переполнении стека.

Компиляция с:

as --32 -o hello.o helloworld-a.asm

ld -m elf_i386 -o привет привет.о

./привет

Когда я его не использую, у меня нет вывода на консоль.

Спасибо :)


person Jan Wolfram    schedule 28.10.2019    source источник
comment
Потому что тебе нужен адрес. Без этого вы получаете ссылку на память в режиме синтаксиса Intel.   -  person Jester    schedule 29.10.2019
comment
Это из-за метки, потому что я видел и другой код, где они определяют строку по-другому, например hello db Hallo Welt!,0xa, и не использовали ее.   -  person Jan Wolfram    schedule 29.10.2019
comment
Однако это не синтаксис ассемблера gnu.   -  person Jester    schedule 29.10.2019
comment
@JanWolfram: предположительно, это был синтаксис NASM. NASM — это другая разновидность синтаксиса Intel, где имя простого символа всегда является адресом; вам понадобится mov edx, [str] в NASM, чтобы выполнить 4-байтовую загрузку с адреса метки. Но GAS .intel_syntax noprefix похож на MASM. О различиях см. stackoverflow.com/tags/intel-syntax/info.   -  person Peter Cordes    schedule 29.10.2019
comment
PS: используйте отладчик и/или strace, чтобы увидеть, какие аргументы вы передаете системным вызовам. Даже дизассемблер синтаксиса AT&T показал бы вам проблему, поскольку вы знаете разницу между mov $str, %ecx и mov str, %ecx.   -  person Peter Cordes    schedule 29.10.2019