Как правильно заменить printf на sys_write?
Я делаю новый пост о той же программе - извините, но я думаю, что мой вопрос сильно отличается от предыдущего. Моя программа в начале получает 2 параметра - количество повторов и строку. Количество повторений определяет, сколько раз должно быть напечатано последнее слово из строки. Например:
./a.out 3 "ab cd"
показывает в выходной
cdcdcd
Я уже сделал (с помощью пользователей Stack:-)) рабочую программу, использующую вызов printf. Он работает только для 0–9 повторений, но это не так важно, как главное - мой вопрос - как заменить этот "вызов printf" вызовом sys_write.
Я получил информацию, что я должен скомпилировать это с помощью
-nostdlib
вариант, но это не имеет значения, если мой код не является правильным. Я старался изо всех сил, и я также нашел некоторую информацию о возможных методах здесь, но я не могу заставить его работать должным образом.
Печать новой строки работает хорошо, но я понятия не имею, как поступить со строкой из параметра #2, связанной с sys_write. Было бы здорово, если бы кто-то более опытный нашел время и указал, что мне нужно изменить в коде. Прошло некоторое время, чтобы пройти через версию "call printf", но затем я смог поэкспериментировать, и теперь я полностью потерян. Вот:
.intel_syntax noprefix
.globl _start
.text
_start:
push ebp
mov ebp, esp
mov ecx, [ebp + 4] # arg1 int ECX
mov ebx, [ebp + 8] # arg2 string EBX
xor eax, eax
# ARG1 - FROM STRING TO INT
atoi:
movzx edx, byte ptr [ecx]
cmp edx, '0'
jb programend
sub edx, '0'
mov ecx, edx
## =========================== FUNCTION =========================== ##
# SEARCH FOR END OF STRING
findend:
mov dl, byte ptr [ebx + eax] # move through next letters
cmp dl, 0
jz findword
inc eax
jmp findend
# SEARCH FOR LAST SPACE
findword:
dec eax
mov dl, byte ptr [ebx + eax]
cmp dl, ' '
jz foundwordstart
jmp findword
# REMEMBER SPACE POSITION, CHECK COUNTER >0
foundwordstart:
push eax # remember space position
cmp ecx, 0 # check if counter > 0
jz theend
jmp foundword
# PRINT LAST WORD
foundword:
inc eax
mov dl, byte ptr [ebx + eax]
cmp dl, 0
jz checkcount
push ecx
push eax # save current position in word
push edx
push ebx
lea ecx, [ebx+eax] # char * to string
mov eax, 4 # sys_write
mov edx, 1; # how many chars will be printed
mov ebx, 1 # stdout
int 0x80
pop ebx
pop edx
pop eax
pop ecx
jmp foundword
# decrease counter and restore beginning of last word
checkcount:
dec ecx # count = count-1
pop eax # restore beginning of last word
jmp foundwordstart
theend:
pop eax # pop the space position from stack
jmp programend
# END OF PROGRAM
programend:
pop ebp
# new line
mov eax,4
mov ebx,1
mov ecx,offset msgn
mov edx,1
int 0x80
# return 0
mov eax, 1
mov ebx, 0
int 0x80
.data
msgn: .ascii "\n"
Мне также очень странно, что я могу запустить его:
mov ecx, [ebp + 12]
mov ecx, [ecx + 8]
add ecx, eax # char * to string
mov eax, 4 # sys_write
mov edx, 1; # how many chars will be printed
mov ebx, 1 # stdout
int 0x80
и это работает хорошо - но только если я не использую -nostdlib (и, конечно, я должен изменить _start на main)...