Новое в сборке. Как посчитать количество символов в переданном аргументе? - PullRequest
0 голосов
/ 27 января 2019

Я очень новичок в сборке, поэтому, пожалуйста, прости меня, если это довольно тривиально.Для следующей команды:

$ ./prog1 *string*

, где string - передаваемый аргумент и некоторая последовательность символов (но без пробелов), как мне найти число символов в строка ?Я хочу, чтобы prog1 просто выводил именно то, что было напечатано, включая символ новой строки.Например:

$ ./prog1 helloworld

просто выведет "helloworld" и символ новой строки.Пока что мой код распечатывает входные данные, но мне нужно передать действительное количество символов в регистр% edx, чтобы он печатался правильно, в противном случае мне придется самому жестко кодировать количество символов.

.globl _start



_start:

movl $4,%eax

movl $1,%ebx

movl 4(%esp),%ecx     ; <--- save argument to %ecx register

movl $100, %edx       ; <--- need to know exactly how many characters in argument to %edx register

int $0x80



#Exit

movl $1,%eax

movl $0,%ebx

int $0x80

Моя идея состояла в том, чтобы использовать аккумулятор и перебирать строку , чтобы посчитать количество символов в байтах до тех пор, пока я не достигну нулевого терминатора.Но как именно это делается в ГАЗЕ?

1 Ответ

0 голосов
/ 28 января 2019

В Nasm вы можете попробовать это:

    section .text
    global _start

    _start:
            push ebp
            mov ebp, esp

            mov ebx, [ebp+12]
            cmp ebx, 0x00
            jz exit
            mov eax, ebx

    compare:

            cmp byte [eax], 0x00
            jz print
            inc eax
            jmp compare 

    print:
            sub eax, ebx ; now eax have the len of the string in argv[1]


    exit:
            mov eax, 0x1
            mov ebx, 0x0
            int 0x80

Я тоже новичок в asm, но надеюсь помочь

...