Я пишу ассемблерную программу в 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?
Заранее спасибо.