dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба Добрый день всем. Есть простая программка: .global _start _start: _read: @ read syscall MOV R7, #3 @ Syscall number MOV R0, #0 @ Stdin is keyboard MOV R2, #1 @ read one character only LDR R1,=string @ string at string: SVC 0 _togglecase: LDR R0, [R1] @ load it into R0 ORR R0, R0, #0x20 @ change case STR R0, [R1] @ write char back _write: @ write syscall MOV R7, #4 @ Syscall number MOV R0, #1 @ Stdout is monitor MOV R2, #2 @ string is 2 char long(+ пробел) SVC 0 _exit: MOV R7, #1 все работает вроде как надо, те вводим букву в вернем регистре, получаем в нижнем. Суть: 1 вопрос - почему код выхода $echo $? 2 а не 1(последнее, что было в R0). " вопрос - почему оболочка как-бы дважды отрабатывает выход из дочернего процесса и дважды генерирует приглашение командной строки? pi@raspberrypi:~/cods/upper_case $ ./upper A a pi@raspberrypi:~/cods/upper_case $ pi@raspberrypi:~/cods/upper_case $ Заранее спасибо за конкретные ответы или точные указания, как их получить. PS в коде,конечно, в конце стоит .data string: .ascii " \n" Изменено 16 августа, 2023 пользователем dio4 дописал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба Очевидно, системный вызов изменяет содержимое регистров. "Ввод" остаётся в буфере ввода и оболочка его считывает. Изменено 16 августа, 2023 пользователем vov4ick Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба 39 минут назад, vov4ick сказал: Очевидно, системный вызов изменяет содержимое регистров. "Ввод" остаётся в буфере ввода и оболочка его считывает. То, что в stdin остается '\n' это я уже допетрил. А вот с "Очевидно, системный вызов изменяет содержимое регистров." можно по-подробнее...у меня нет команды, меняющей содержимое регистра, отвечающего за вывод содержимого в оболочку. И спасибо, что ответили. Уточню для конкретики - в проге три системных вызова. Какой из них меняет содержимое какого регистра(без указания явной команды в коде), на что меняет и почему? Спасибо. Изменено 16 августа, 2023 пользователем dio4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба А как, по-вашему, эта маленькая программка считывает данные с клавиатуры и выводит в терминал? Поищите по запросу системный вызов linux Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба 3 минуты назад, vov4ick сказал: А как, по-вашему, эта маленькая программка считывает данные с клавиатуры и выводит в терминал? Поищите по запросу системный вызов linux Спасибо, я поищу. Считывает с клавы, со stdin, выводит на stdout, третий делает выход из программы. А почему и какой вызов меняет содержимое регистра с 1 на 2 не ясно. Можете пролить свет на это? Изменено 16 августа, 2023 пользователем dio4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба Нет у процессора регистров stdin и stdout, он вообще понятия не имеет что это такое :) За коротенькой инструкцией svc 0 скрываются мегабайты кода ядра ОС, обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба 6 минут назад, vov4ick сказал: Нет у процессора регистров stdin и stdout, он вообще понятия не имеет что это такое 🙂 За коротенькой инструкцией svc 0 скрываются мегабайты кода ядра ОС, обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае. Я про регистры ничего не говорил. Я сказал, что прога считывает со stdin символ, преобразует его и выводит на sdtout. Регистры используются как место хранения параметров сист. вызовов и хранения данных ( в тч считанного с клавы символа). Я повторю вопрос - "почему и какой вызов меняет содержимое регистра с 1 на 2 не ясно. Можете пролить свет на это?" Если нет, то пожалуйста, не нужно писать ничего. Спасибо заранее. Или если есть сказать - где конкретно посмотреть(те конкретно, а не тонны информации при проге в три строчки). 8 минут назад, vov4ick сказал: Нет у процессора регистров stdin и stdout, он вообще понятия не имеет что это такое 🙂 За коротенькой инструкцией svc 0 скрываются мегабайты кода ядра ОС, обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае. скажите, в какой конкретно строке кода svc меняет 1 на 2 и почему? Изменено 16 августа, 2023 пользователем dio4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба 9 минут назад, dio4 сказал: скажите, в какой конкретно строке кода svc меняет 1 на 2 и почему? В какой-то из миллионов строк кода ядра ОС. С точки зрения вашей программы это происходит во время выполнения инструкции svc. 10 минут назад, dio4 сказал: где конкретно посмотреть(те конкретно, а не тонны информации при проге в три строчки). В документации на системные вызовы вашей ОС. 11 минут назад, dio4 сказал: обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае. Через РОН, системный вызов передаёт вашей программе какую-то информацию, потому они и изменяются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба Хорошо, тогда какой из ТРЕХ системных вызовов делает то, что вы описали? В какой строке кода? РОН в 32 битной arm 12, почему меняется именно тот, о котором вы говорите? В какой конкретно строке кода?(или каких). Вы понимаете, что ответ "это все ядро - оно великое и ужасное" это не ответ. Но спасибо за попытку помочь. Изменено 16 августа, 2023 пользователем dio4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба Все системные вызовы возвращают, как минимум, код возврата в одном из регистров. Что ещё они возвращают и в каких регистрах, какие регистры сохраняют, какие портят, нужно смотреть в документации. Не на процессор, а на вашу ОС. Системные вызовы в разных ОС разные. Именно поэтому для унификации придумана libc. Вся работа ОС с точки зрения вашей программы происходит во время исполнения инструкции svc. Изменено 16 августа, 2023 пользователем vov4ick Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба Те вы утверждаете, что эта программка имеет некое нестабильное поведение(те делает то, чего там не написано на ассемблере)? Можете объяснить где конкретно и почему? А так - у меня там есть строка, конкретно записывающая 1 в регистр, а потом это значение непонятно почему становится равным 2. Именно этот регистр используется для вывода кода выхода программы. Я задал конкретные вопросы по проге из 10 строк 😀- в какой строке кода и почему меняется это значение регистра - вы так и не ответили. Но я поблагодарю вас снова за ваше время. Спасибо. Изменено 16 августа, 2023 пользователем dio4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 189 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба Вам же написали, что функция перед своим выходом порождает системный вызов SVC 0. Системный вызов - обычно - какое-то синхронное прерывание, которое вполне могло записать в R0 что-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 16 августа, 2023 Опубликовано 16 августа, 2023 (изменено) · Жалоба 9 минут назад, dio4 сказал: Те вы утверждаете, что эта программка имеет некое нестабильное поведение Возможно. После первого вызова используется R1, но наверное автор уверен что он не меняется, изучил документацию. 9 минут назад, dio4 сказал: строка, конкретно записывающая 1 в регистр, а потом это значение непонятно почему становится равным 2 Не непонятно почему, а после работы системного вызова. 9 минут назад, dio4 сказал: в какой строке кода и почему меняется это значение регистра Во всех строках где записана команда svc 0. Их там две. Потому что ОС таким способом передаёт вам информацию. Изменено 16 августа, 2023 пользователем vov4ick Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio4 4 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба 1 минуту назад, vov4ick сказал: Нет Не непонятно почему, а после работы системного вызова. Во всех строках где записана команда svc 0. Их там две. Потому что ОС таким способом передаёт вам информацию. Нет не во всех, я прошелся в gdb и посмотрел - только в последнем. Я и спрашиваю - почему? 4 минуты назад, Arlleex сказал: Вам же написали, что функция перед своим выходом порождает системный вызов SVC 0. Системный вызов - обычно - какое-то синхронное прерывание, которое вполне могло записать в R0 что-то. svc 0 должен делать только выход программы из системы и ничего больше. "Записать что-то..." ничего просто так как "что-то" не происходит - для всего есть конкретная причина и я пытаюсь ее понять. А так у вас звучит как магия. Прошу - давайте только по существу, если можно. 9 минут назад, Arlleex сказал: Вам же написали, что функция перед своим выходом порождает системный вызов SVC 0. Системный вызов - обычно - какое-то синхронное прерывание, которое вполне могло записать в R0 что-то. извините - у меня там нет функций, просто svc 0 это и есть обращение из программы на asm к системному вызову. 0 - указывает обработчику svsc к какому конкретно..вот и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба 7 минут назад, dio4 сказал: Я и спрашиваю - почему? Потому что следует прочитать Соглашения вызова того, что вызываете. Прежде чем вызывать. Соглашения вызова функций системного сервиса SVC 0. В соглашениях вызова описано: какие регистры используются для передачи аргументов, какие - для возврата результатов, какие - портятся, а какие - сохраняются вызываемой функцией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться