@Chame1eon
Пишу скрипты, глотаю кофе!

Как ввести и вывести число в assembler(AT&T, GAS синтаксис)?

Приветствую всех.
Учусь разработке на Assembler
При обучении возникла задача - написание калькулятора.
Пишу под Linux(Ubuntu), следовательно приходится осваивать синтаксис GAS(AT&T)
Возникла проблема с выводом, а именно при компиляции этого кода:
.data
number:
  .long 0x00000595
str:
  .space 4, 0
i:
  .byte 0

str_len =.-str

.text
  .global _start
_start:

  0:
    addb $str, i
    movb $0x30, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  1:
    addb $str, i
    movb $0x31, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  2:
    addb $str, i
    movb $0x32, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  3:
    addb $str, i
    movb $0x33, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  4:
    addb $str, i
    movb $0x34, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  5:
    addb $str, i
    movb $0x35, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  6:
    addb $str, i
    movb $0x36, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  7:
    addb $str, i
    movb $0x37, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  8:
    addb $str, i
    movb $0x38, (%eax)
    incb %al
    movb %al, (i)
    jmp logic

  9:
    addb $str, i
    movb $0x39, (%eax)
    incb %al
    movb %al, (i)
    jmp logic


  logic:
    movl $number, %eax
    cdq
    movl $10, %ebx
    idivl %ebx

    cmpl $0, %edx
    je 0
    cmpl $1, %edx
    je 1
    cmpl $2, %edx
    je 2
    cmpl $3, %edx
    je 3
    cmpl $4, %edx
    je 4
    cmpl $5, %edx
    je 5
    cmpl $6, %edx
    je 6
    cmpl $7, %edx
    je 7
    cmpl $8, %edx
    je 8
    cmpl $9, %edx
    je 9

    movl $4, %eax
    movl $1, %ebx
    movl $str, %ecx
    movl $str_len, %edx
    int $0x80

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

При компиляции появляется такая ошибка:
$ as --64 test_print.s -o test_print.o
$ ld -melf_x86_64 -s test_print.o -o test_print
test_print.o: In function `_start':
(.text+0x7): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0x21): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0x3b): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0x55): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0x6f): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0x86): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0x9d): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0xb4): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0xcb): relocation truncated to fit: R_X86_64_8 against `.data'
(.text+0xe2): relocation truncated to fit: R_X86_64_8 against `.data'

Помогите разобраться, сломал себе весь мозг.
P.S. Буду очень благодарен, если подскажите на основе скрипта вывода способ получения числа из символьного массива при вводе
  • Вопрос задан
  • 363 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Пишу под Linux(Ubuntu), следовательно приходится осваивать синтаксис GAS(AT&T)

Не, не "следовательно". gas умеет как синтексис intel (.intel_syntax) так и синтаксис at&t (.att_syntax).

addb $str, i
relocation truncated to fit: R_X86_64_8 against `.data'

Потому что при сборке под 64 бита надо адресоваться относительно %rip. Если оно тебе не надо, проще собирать под 32 бита.

int $0x80

Не работает в 64-битных программах. Ну ты понел. (с)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы