На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Вызов sys_write не выводит сообщение в консоль терминала , GNU Assembly
    Код

    ExpandedWrap disabled
      .data
       message: .ascii "ASSEMBLY OUTPUT"
       
      .text
      .globl _start
       
      _start:
      movq $1, %rdi
      movq $1, %rax
      movq $15, %rdx
      movq $message, %rsi
      syscall
      movq $60, %rax
      movq $0, %rdi
      syscall


    После запуска программа выполняется, но ничего в терминал не выводит, а по задумке должна вывести сообщение ASSEMBLY OUTPUT.

    В чём может быть проблема в Linux с этим кодом?
      eax=1 - это вроде бы sys_exit. A sys_write - это eax=4.

      Или не?
        По справке https://filippo.io/linux-syscall-table/ код такой.

        Проблема в исходнике была в отсутствии символов \n в строке, поэтому её не видно было.
          Цитата Akina @
          eax=1 - это вроде бы sys_exit. A sys_write - это eax=4.
          Это в 32-х битах 1 - выход, 4 - запись, а в 64-х битах: 1 - write, 60 - выход. Такая немного странная система.

          Sunless, у меня всё работает.
          Может, вы не так компилируете как-то?

          ExpandedWrap disabled
            as --64 -g -o code.o code.s
            ld -m elf_x86_64 -o code code.o
            Код изменил. Посоветовали добавить flush. Он может быть выполнен символом новой строки в сообщении, а можно вызвать fsync.
            ExpandedWrap disabled
               .data
                  message: .ascii "ASSEMBLY OUTPUT MESSAGE"
                  .equ one, 1
                  len = . - message
               
                   .text
                  .globl _start
               
                  _start:
                  movq $one, %rdi
                  movq $one, %rax
                  movq $len, %rdx
                  movq $message, %rsi
                  syscall #sys_write
                  movq $74, %rax #rdi == 1
                  syscall #fsync
                  movq $60, %rax
                  xor %rdi, %rdi
                  syscall #exit


            У меня binutils 2.30 для компиляции и терминал в Linux. Сборка:
            Цитата
            as -g -mintel64 -mtune=corei7 -o main.o main_part1.s
            ld -Ofast -o main main.o
            Сообщение отредактировано: Sunless -
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0537 ]   [ 15 queries used ]   [ Generated: 10.04.24, 06:14 GMT ]