Я пытаюсь узнать системные вызовы в сборке с этой страницы на tutorialspoint .
На этой странице есть код сборки, который считывает вводимые пользователем данные и выводит их.Это выглядит странно для меня и, к сожалению, не работает:
section .data ;Data segment
userMsg db 'Please enter a number: ' ;Ask the user to enter a number
lenUserMsg equ $-userMsg ;The length of the message
dispMsg db 'You have entered: '
lenDispMsg equ $-dispMsg
section .bss ;Uninitialized data
num resb 5
section .text ;Code Segment
global _start
_start: ;User prompt
mov eax, 4
mov ebx, 1
mov ecx, userMsg
mov edx, lenUserMsg
int 80h
;Read and store the user input
mov eax, 3
mov ebx, 2
mov ecx, num
mov edx, 5 ;5 bytes (numeric, 1 for sign) of that information
int 80h
;Output the message 'The entered number is: '
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
;Output the number entered
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 5
int 80h
; Exit code
mov eax, 1
mov ebx, 0
int 80h
Как только код выполнен, программа никогда не запрашивает ввод - она немедленно вызывает системный выход.
Iнайти некоторые части кода запутанными и предположить, что они могут что-то делать с ошибкой:
;Read and store the user input
mov eax, 3
mov ebx, 2
mov ecx, num
mov edx, 5 ;5 bytes (numeric, 1 for sign) of that information
int 80h
В приведенном выше коде для eax
(32-разрядный регистр аккумулятора) имеет смысл3
, так как он выполняет sys_read
системный вызов.edx
вероятно, определил тип данных, и, учитывая, что мы сохраняем целое число, 5
имеет смысл.
Но 32-битный базовый регистр должен содержать индекс дескриптора файла (где stdin=0
, stdout=1
, stderr=2
).Но почему ebx=2
в приведенном выше коде?
Извините, если вопрос слишком прост, но почему код не будет работать?Что-то не так с неправильным выбором входов в регистрах?то есть то, что я упомянул выше.