С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/23: Рейтинг темы: голосов - 23, средняя оценка - 4.78
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
GAS/AT&T

Вызов printf с локальной переменной в качестве параметра

09.04.2020, 18:37. Показов 4665. Ответов 13

Студворк — интернет-сервис помощи студентам
помогите еще советом.
посидел не один день и что-то не дошло до меня почему программа крашится.



Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
.section .data
format: asciz "%s"
 
.section .text
.global main
main:
 
push %rbp
mov %rsp, %rbp
 
subq $80, %rsp
 
 
 
mov $0, %rax
mov $0, %rdi
lea -64(%rbp), %rsi
mov $16, %rdx
syscall
 
 
 
lea -64(%rbp), %rsi
lea format(%rip), %rdi
call printf
 
leave 
ret
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2020, 18:37
Ответы с готовыми решениями:

Вызов функции с ссылкой на структуру в качестве параметра
Добрый день, совсем недавно начал изучение С++. Создал я небольшую программку, и сложился соответственно вопрос. Есть такой код: ...

Передача переменной GET-запроса в качестве параметра в SQL-команду
Здравствуйте! На странице ASPX есть контролы: <asp:Repeater ID="Repeater1" DataSourceID="SqlDataSource1"...

Как в качестве параметра запроса передать значение переменной?
Запрос типа SELECT TOP 10 * FROM TABLENAMEКак в качестве параметра 10 передать значение переменной? SELECT TOP @int * FROM TABLENAME не...

13
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8648 / 4483 / 1669
Регистрация: 01.02.2015
Сообщений: 13,890
Записей в блоге: 12
09.04.2020, 19:57
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Лучше бы отладчиком выполнить - будет понятно на какой строке.

Я вангую, что на 27-28 - из-за не восстановления стека после выделения места под локальные переменные - нет обратной
Assembler
1
add $80, %rsp
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
09.04.2020, 21:35  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Лучше бы отладчиком выполнить - будет понятно на какой строке.
отладчик тут не поможет. надо кто понимает. будем ждать . в прошлой теме кто-то заглянул же и подсказал. может и сейчас случай подарит знающего человека
printf наверное капризничает
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
10.04.2020, 11:39
Я вангую, что на 27-28 - из-за не восстановления стека
leave восстанавливает esp из ebp.

pcmax
Попробуй обнулить rax перед вызовом printf. На codewars например это обязательно иначе краш, причина не известна, если узнаешь почему так - напиши.
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
10.04.2020, 12:36  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
section .bss
var: .space  4
 
.section .data
fr: .asciz "%s"
 
 
.section .text
.global main
 
 
 
main:
 
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $16, %rsp
 
 
    mov $0, %rax
    mov $0, %rdi
    lea var, %rsi
    mov $4, %rdx
    syscall
 
 
    mov $var, %eax  
    movl    %eax, -4(%rbp)
    movl    -4(%rbp), %eax
 
    
 
    mov  -4(%rbp), %esi
    leaq    fr(%rip), %rdi
    call    printf
    leave
    
    ret
вот так получается. но тут буфер используется. как напрямую без него?
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
10.04.2020, 13:26
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Может теперь работает из-за того, что var выровнена по границе 16 байт? То есть вместо [rbp-64] передавать [rbp-56] для сохранения выравнивания. Всё же уточни в каком месте вылетает на printf или на syscall.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
10.04.2020, 14:13  [ТС]
нет. если ложу строку в локальную переменную не через буффер, то вылетает. если ложу метку, то есть адрес var , ведь var -это адрес, адрес в bss где лежит строка, то при чтении printf крашится.

но мы впрошлой теме писали из файла в локальную переменную и читали, и всем было норм.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
10.04.2020, 15:11
По быстрому набросал код для FASM. В AntiX работает нормально.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
format ELF64 executable 3
include "../examples/linux/import64.inc"
include "linux.inc"
 
interpreter '/lib64/ld-linux-x86-64.so.2'
needed 'libc.so.6'
 
import printf
 
segment readable executable
entry $
  sub     rsp,128
  invoke  sys_read,0,rsp,16
 
  xor     rax,rax
  mov     rdi,fmt
  mov     rsi,rsp
  call    [printf]
 
  add     rsp,128
  invoke  sys_exit,0
 
segment readable writeable
fmt db '%s',0
linux.inc - качать отсюда, import64.inc поставляется вместе с FASM.
Во вложении скомпилированный elf - сравни в дизассемблере свой elf с ним, может найдёшь причину.
Вложения
Тип файла: 7z 1.7z (352 байт, 0 просмотров)
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
10.04.2020, 15:12  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.section .data
fr: .asciz "%s"
file: .asciz "t.txt\0" 
 
.section .text
.global main
 
 
 
main:
 
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $32, %rsp
 
    
 
    mov $0, %rax
    mov $0, %rdi
    
    lea -32(%rbp), %rsi
    mov $64, %rdx
    syscall
 
 
 
    
 
    lea  -32(%rbp), %rsi
    leaq    fr(%rip), %rdi
    call    printf
    leave
    
    ret
вроде что-то нагородил. читает. буду разбираться дальше

спасибо
1
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
10.04.2020, 15:19
Так почему крашилось то?

В стеке резервируешь 32 байта, а sys_read указываешь размер буфера 64 - не хорошо.

Добавлено через 1 минуту
Что означает "$" в этом синтаксисе? Почему перед отрицательными значениями "$" не ставится?
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
10.04.2020, 15:20  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
По быстрому набросал код для FASM. В AntiX работает нормально.
Assembler

только я не понял. вы же не на стек пишите.... я просто не знаю fasm. проблема была в том, чтобы писать сразу на стек, в лок переменную . это не удавалось
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
10.04.2020, 15:22
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Именно в стек. В sys_read в качестве второго параметра передаётся rsp.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
10.04.2020, 15:26  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Что означает "$" в этом синтаксисе? Почему перед отрицательными значениями "$" не ставится?

$-это непосредственная адресация. если mov 5, %rax к примеру, то 5 будет рассмотрен как адрес. если $5 то пять будет использованна в команде как константа

Добавлено через 2 минуты
Цитата Сообщение от murderer Посмотреть сообщение
В стеке резервируешь 32 байта, а sys_read указываешь размер буфера 64
я эксперементировал. искал ошибку. их там много. поэтому сложно найти. буду разбираться
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
20.04.2020, 12:22
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
printf наверное капризничает
У printf проблемы с поиском конца char[], который Ваш код передал как второй параметр через %rsi

Bash
1
2
3
4
$./a.out << END
123456789ABCDEF_123456789ABCDEF_123456789ABCDEF
123456789ABCDEF_123456789ABCDEF
END
Code
1
123456789ABCDEF_$
Я добавил в код только одну строчку, которая ставит '\0' после считанных символов.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.global main
main:
 
push %rbp
mov %rsp, %rbp
 
subq $80, %rsp
 
mov $0, %rax
mov $0, %rdi
lea -64(%rbp), %rsi
mov $16, %rdx
syscall
 
movb $0, -64(%rbp,%rax)
 
lea -64(%rbp), %rsi
lea format(%rip), %rdi
call printf
 
leave
ret
 
.section .rodata
format: .asciz "%s"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2020, 12:22
Помогаю со студенческими работами здесь

Вызов локальной переменной из другого метода
В учебниках по этому поводу ничего не написано. Есть метод -В нём 2 локальные переменные -Они вычисляются и получают определённые...

Сохранение изменений, произведённых в функции с переменной, переданной в эту функцию в качестве параметра.
Всем привет. Собственно, как это можно сделать? :) Пробовал переменную делать и локальной, и глобальной. Но ничего не изменилось.

Ошибка компиляции при попытке передачи переменной ссылочного типа в качестве параметра
Вечер добрый, форумчане. Вопрос в виде комментария написан в коде: namespace TestConsole { class Program { ...

Искать файл, который задан в качестве первого параметра, в каталогах, заданных в качестве остальных параметров
Нужен командный файл, который будет искать файл, который задан в качестве первого параметра в каталогах, заданных в качестве остальных...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru