Как я могу преобразовать строку в целое число, когда я получаю ее из командной строки (Ubuntu NASM 32bit)? - PullRequest
0 голосов
/ 02 декабря 2018
%include "asm_io.inc"

                 segment .data
                 segment .bss
argument         resb 32                    ; argument[32]


                 segment .text
                 global main
main:

                 enter 0,0

                 mov ebx, 4
                 mov ecx, dword [ebp + 4 * ebx]
                 mov eax, dword [ecx + 4]

                 mov [argument], eax

                 mov al, byte [argument + 0]
                 sub al, 48

                 call print_int          




end:             leave
                 mov eax, 0
                 ret

Я пытаюсь преобразовать строку из командной строки в целое число (например, когда я набираю $. / Hello 30 в командной строке, «30» должен быть целочисленным параметром для программы (процедуры)).Обнаружив, что [аргумент + 0] == '30', [аргумент + 1] = bin / bash, я подумал, что могу получить правильное число с помощью [аргумент + 0].но результат как -1075579555.

Даже небольшой комментарий, это было бы очень полезно.спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Когда ваша программа запускается, стек выглядит следующим образом

       0
       Address of last environment string
       ...
       Address of 2nd environment string
       Address of 1st environment string
       0
       Address of last program argument
       ...
       Address of 2nd program argument
       Address of 1st program argument
       Address of program path
ESP -> Number of arguments

Для вашей задачи вам нужно получить адрес для первого аргумента программы.
Вы найдете его в dword [esp + 8].

Сразу после выполнения enter 0,0 и поскольку эта инструкция помещает регистр EBP, вы найдете его в dword [esp + 12] == dword [ebp + 12].

enter   0,0                   ; Same as PUSH EBP : MOV EBP, ESP

mov     ebx, dword [ebp + 12] ; Address of first argument
movzx   eax, byte [ebx]       ; First character, is e.g. "3"
sub     al, "0"               ; Convert from "3" -> 3
imul    eax, 10               ; EAX now holds 3 * 10 == 30
mov     dl, byte [ebx + 1]    ; Second character, is e.g. "5"
sub     dl, "0"               ; Convert from "5" -> 5
add     al, dl                ; EAX now holds 3 * 10 + 5 == 35

call    print_int             ; Prints "35"
...