Как правильно заменить 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)...

0 ответов

Другие вопросы по тегам