Мы выучили только прикосновение (на ощупь я ничего не имею в виду в классе, только теоретические разговоры о том, как работают регистры) сборки в школе, и мой профессор хочет, чтобы мы что-то делали в сборке немного сложнее, чем добавление двух целых чисел. Я провел кучу исследований и придумал код. Я использую Microsoft Visual Code на виртуальной машине Linux. Насколько я понимаю, код помещает input1
в ECX, затем помещает input2
в ECX, и это, по существу, добавляет, если длина input1
составляет не менее 10 байтов. Не совсем уверен, как это работает. Если для первого ввода я использую менее 10 байт, следующий вывод печатается на новой строке.
Я пытался понять, как [переменная] и переменная, значение и адрес, если я правильно понимаю, вписываются в это и играют с зарезервированными байтовыми переменными. Я не прошу, чтобы мой проект был завершен, но мне кажется, что я слепо пытаюсь это сделать, а не без направления. Заранее спасибо, ребята!
section .text
global main ;must be declared for using gcc
extern printf ;C library used to print
extern exit ;C library used to exit
extern scanf ;C library used to input user entry
main: ;tell linker entry point, called main due to C library usage
;Reads prompt message
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, prompt1 ;message to write called prompt
mov edx, len1 ;message length
int 0x80 ;call kernel
;Accept user input
mov eax, 3 ;system call number (sys_read)
mov ebx, 0 ;file descriptor (stdin)
mov ecx, input1 ;variable to read into, i.e. input
mov edx, 25 ;input length
int 0x80 ;call kernel
;Reads prompt message
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, prompt2 ;message to write called prompt
mov edx, len2 ;message length
int 0x80 ;call kernel
;Accept user input
mov eax, 3 ;system call number (sys_read)
mov ebx, 0 ;file descriptor (stdin)
mov ecx, input2 ;variable to read into, i.e. input
mov edx, 25 ;input length
int 0x80 ;call kernel
;cld
mov al, 0
mov ecx, 50
mov edi, input3
repne scasb
dec edi
mov ecx, 2
mov esi, input4
rep movsb
int 0x80
;Display user input
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, input1 ;message to write
mov edx, 50 ;message length
int 0x80 ;call kernel
call exit
section .data
prompt1 db 'Please enter your first string: ', 0xa ;string to print for user input
len1 equ $ - prompt1 ;length of string prompt
prompt2 db 'Please enter your second string: ',0xa ;string to print for user input
len2 equ $ - prompt2 ;length of string prompt
input3: times 10 db 0 ;variable input is of 10 bytes, null string terminated
input4: times 1 db 0
section .bss
input1 resb 50
input2 resb 25