Построение входного ридера в сборке x86 - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь узнать системные вызовы в сборке с этой страницы на 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 в приведенном выше коде?


Извините, если вопрос слишком прост, но почему код не будет работать?Что-то не так с неправильным выбором входов в регистрах?то есть то, что я упомянул выше.

...