Перейти к содержанию
    

Непонятный код выхода из программы на asm.

Добрый день всем. Есть простая программка:
 

        .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"

 

Изменено пользователем dio4
дописал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очевидно, системный вызов изменяет содержимое регистров.

"Ввод" остаётся в буфере ввода и оболочка его считывает.

Изменено пользователем vov4ick

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, vov4ick сказал:

Очевидно, системный вызов изменяет содержимое регистров.

"Ввод" остаётся в буфере ввода и оболочка его считывает.

 

То, что в stdin остается '\n' это я уже допетрил. А вот с "Очевидно, системный вызов изменяет содержимое регистров." можно по-подробнее...у меня нет команды, меняющей содержимое регистра, отвечающего за вывод содержимого в оболочку. И спасибо, что ответили.

Уточню для конкретики - в проге три системных вызова. Какой из них меняет содержимое какого регистра(без указания явной команды в коде), на что меняет и почему? Спасибо.

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как, по-вашему, эта маленькая программка считывает данные с клавиатуры и выводит в терминал?

Поищите по запросу системный вызов linux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, vov4ick сказал:

А как, по-вашему, эта маленькая программка считывает данные с клавиатуры и выводит в терминал?

Поищите по запросу системный вызов linux

Спасибо, я поищу. Считывает с клавы, со stdin, выводит на stdout, третий делает выход из программы. А почему и какой вызов меняет содержимое регистра с 1 на 2 не ясно. Можете пролить свет на это?

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет у процессора регистров stdin и stdout, он вообще понятия не имеет что это такое :)

За коротенькой инструкцией svc 0 скрываются мегабайты кода ядра ОС, обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, vov4ick сказал:

Нет у процессора регистров stdin и stdout, он вообще понятия не имеет что это такое 🙂

За коротенькой инструкцией svc 0 скрываются мегабайты кода ядра ОС, обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае.

Я про регистры ничего не говорил. Я сказал, что прога считывает со stdin символ, преобразует его и выводит на sdtout. Регистры используются как место хранения параметров сист. вызовов и хранения данных ( в тч считанного с клавы символа). Я повторю вопрос - "почему и какой вызов меняет содержимое регистра с 1 на 2 не ясно. Можете пролить свет на это?" Если нет, то пожалуйста, не нужно писать ничего. Спасибо заранее. Или если есть сказать - где конкретно посмотреть(те конкретно, а не тонны информации при проге в три строчки).

8 минут назад, vov4ick сказал:

Нет у процессора регистров stdin и stdout, он вообще понятия не имеет что это такое 🙂

За коротенькой инструкцией svc 0 скрываются мегабайты кода ядра ОС, обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае.

скажите, в какой конкретно строке кода svc меняет 1 на 2 и почему?

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, dio4 сказал:

скажите, в какой конкретно строке кода svc меняет 1 на 2 и почему?

В какой-то из миллионов строк кода ядра ОС. С точки зрения вашей программы это происходит во время выполнения инструкции svc.

10 минут назад, dio4 сказал:

где конкретно посмотреть(те конкретно, а не тонны информации при проге в три строчки).

В документации на системные вызовы вашей ОС. 

11 минут назад, dio4 сказал:

обмен информацией с которым производится разными способами, в том числе с помощью РОН процессора, как в вашем случае.

Через РОН, системный вызов передаёт вашей программе какую-то информацию, потому они и изменяются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, тогда какой из ТРЕХ системных вызовов делает то, что вы описали? В какой строке кода? РОН в 32 битной arm 12, почему меняется именно тот, о котором вы говорите? В какой конкретно строке кода?(или каких). Вы понимаете, что ответ "это все ядро - оно великое и ужасное" это не ответ. Но спасибо за попытку помочь.

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все системные вызовы возвращают, как минимум, код возврата в одном из регистров. Что ещё они возвращают и в каких регистрах, какие регистры сохраняют, какие портят, нужно смотреть в документации. Не на процессор, а на вашу ОС. Системные вызовы в разных ОС разные. Именно поэтому для унификации придумана libc.

Вся работа ОС с точки зрения вашей программы происходит во время исполнения инструкции svc.

Изменено пользователем vov4ick

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Те вы утверждаете, что эта программка имеет некое нестабильное поведение(те делает то, чего там не написано на ассемблере)? Можете объяснить где конкретно и почему? А так - у меня там есть строка, конкретно записывающая 1 в регистр, а потом это значение непонятно почему становится равным 2. Именно этот регистр используется для вывода кода выхода программы. Я задал конкретные вопросы по проге из 10 строк 😀- в какой строке кода и почему меняется это значение регистра - вы так и не ответили. Но я поблагодарю вас снова за ваше время. Спасибо.

Изменено пользователем dio4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам же написали, что функция перед своим выходом порождает системный вызов SVC 0.

Системный вызов - обычно - какое-то синхронное прерывание, которое вполне могло записать в R0 что-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, dio4 сказал:

Те вы утверждаете, что эта программка имеет некое нестабильное поведение

Возможно. После первого вызова используется R1, но наверное автор уверен что он не меняется, изучил документацию.

9 минут назад, dio4 сказал:

строка, конкретно записывающая 1 в регистр, а потом это значение непонятно почему становится равным 2

Не непонятно почему, а после работы системного вызова.

9 минут назад, dio4 сказал:

в какой строке кода и почему меняется это значение регистра

Во всех строках где записана команда svc 0. Их там две. Потому что ОС таким способом передаёт вам информацию. 

Изменено пользователем vov4ick

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, vov4ick сказал:

Нет

Не непонятно почему, а после работы системного вызова.

Во всех строках где записана команда svc 0. Их там две. Потому что ОС таким способом передаёт вам информацию. 

Нет не во всех, я прошелся в gdb и посмотрел - только в последнем. Я и спрашиваю - почему?

4 минуты назад, Arlleex сказал:

Вам же написали, что функция перед своим выходом порождает системный вызов SVC 0.

Системный вызов - обычно - какое-то синхронное прерывание, которое вполне могло записать в R0 что-то.

svc 0 должен делать только выход программы из системы и ничего больше. "Записать что-то..." ничего просто так как "что-то" не происходит - для всего есть конкретная причина и я пытаюсь ее понять. А так у вас звучит как магия. Прошу - давайте только по существу, если можно.

9 минут назад, Arlleex сказал:

Вам же написали, что функция перед своим выходом порождает системный вызов SVC 0.

Системный вызов - обычно - какое-то синхронное прерывание, которое вполне могло записать в R0 что-то.

извините - у меня там нет функций, просто svc 0 это и есть обращение из программы на asm к системному вызову. 0 - указывает обработчику svsc к какому конкретно..вот и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, dio4 сказал:

Я и спрашиваю - почему?

Потому что следует прочитать Соглашения вызова того, что вызываете. Прежде чем вызывать. Соглашения вызова функций системного сервиса SVC 0.

В соглашениях вызова описано: какие регистры используются для передачи аргументов, какие - для возврата результатов, какие - портятся, а какие - сохраняются вызываемой функцией. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...