Прочитать аргументы командной строки в сборке - PullRequest
2 голосов
/ 28 мая 2020

Я пишу ассемблерную программу в NASM, и как ее часть я хочу иметь возможность читать аргументы командной строки, которые в моем случае могут быть одним из двух: отладочное сообщение «-d» или представленное число в Hex, поэтому, например:

`./programName AF -d` 

Дело в том, что когда я использую pop первый аргумент из стека, который не является arg c или programName, предполагается, что это строка, представляющая, скажем, шестнадцатеричное число , и я пытаюсь обработать его байт-байт, в конечном итоге с ошибкой сегментации. Вот моя попытка:

main:
push ebp
mov ebp, esp

mov ecx, [ebp +8]      ;argc
mov eax, [ebp + 16]    ; first arg that was put in by the user
dec ecx                ; update num of "real" args

.nextArg:
    cmp ecx, 0
    je .noMoreArgs
    push eax
    call process_arg
    add esp, 4
    dec ecx
    jmp .nextArg
.noMoreArgs:
 ...

функция process_arg: (емкость - это переменная в памяти, указывающая емкость выделенного стека в битах, debugStr - это строка для сравнения)

push ebp
mov ebp, esp
mov edx, [ebp+8]                    ; edx points to the argument string

.debug:
    mov bl, byte [edx]                      ; load first byte of debugStr (bl_1 = '-', bl_2 = 'd')
    cmp bl, '-'                        ; cmp char by char
    jnz .stack
    inc edx                            ; get ready for next char
    mov bl, byte [edx]                      ; load second byte of debugStr (bl_1 = '-', bl_2 = 'd')
    cmp bl, 'd'                        ; cmp char by char
    jnz .stack
    mov [debug_mode], dword 1
    jmp end

    .stack:
    mov edx, [ebp+8]                ; ecx points to the argument string
    xor ebx, ebx
    xor eax, eax
    mov ecx, 2
.loop: 
    mov bl, [edx]                   ; get byte pointed to by edx
    cmp bl, '9'                     ; if larger than 9 => digit is a letter (assuming valid input)
    ja .letter                      ; jmp to proceesing a letter digit
    sub bl, '0'
    ja .mul                         
.letter:
    sub bl, 37h
.mul:
    mov edi, 16
    mul edi
    add eax, ebx
    inc edx
    loop .loop

    mov edi, 4
    mul edi
; at this point eax should hold the INT value of stack_size
    mov [capacity], eax             

end:
    pop edx
    pop ecx
    pop ebx
    mov esp, ebp
    pop ebp
    ret

Есть идеи, в чем может быть причина? или пояснения по поводу чтения аргументов cmdline? А также использование для этой цели lea (загрузить эффективный адрес) и чем он отличается от простого mov?

Заранее спасибо.

...