Во-первых, я новичок в сборке, но имею неплохой опыт работы с c ++.Моя проблема проистекает из учебника, за которым я следовал Аргументы командной строки, используя сборку .
Когда программа запускается, она делает все, что должна делать, в соответствии с учебником, который отображает списоквходных данных программы: ./asm1 arg1 arg2 arg3
Проблема заключается в том, что в качестве аргумента вы указываете астриск: ./asm1 *
Эффективно работает / usr / bin / ls на CWD.
Мой вопрос: как мне предотвратить это, и любые советы о том, как лучше реализовать эту программу.
Заменено:
; the loop
cmp ecx, eax ; if ecx not equal to eax
jne begin_for_loop ; jmp to loop, else exit
На:
; the loop
cmp ecx, eax ; if ecx not equal to eax
jmp begin_for_loop ; jmp to loop, else exit
И я обнаружил большую проблему, когдаПрограмма выводит переменные ENV на экран.
Ниже приведена оригинальная программа:
; FOR LOOP: Print commandline arguments> an equivalent program to
this in assembly
SECTION .data
argv db "Arguments = %s",10,0
argc db "Argument Count = %d",10,0
SECTION .text
; allow access to printf
extern printf
; make main_function available externally
global main
main: ; int main (int argc, char* argv[])
push ebp
mov ebp,esp
sub esp, 10
mov eax, DWORD [ebp + 8] ; points to argc
mov ebx, DWORD [ebp + 12] ; points to argv
mov ecx, 0 ; mov ZERO to count register
begin_for_loop:
; always preserve values prior to external function calls
; external function calls may modify values you placed in registers
push ebx ; preserve ebx; holds argument address
push eax ; preserve eax; holds number of arguments
push ecx ; preserve ecx; holds the counter
; call printf
push DWORD [ebx]
push argv
call printf
add esp, 8 ; clean up the stack
; always restore in backwards order
pop ecx ; restore counter
pop eax ; restore number of arguments
pop ebx ; restore argument address
inc ecx ; increase our counter by 1
add ebx, 4 ; move to next argument in the array
; the loop
cmp ecx, eax ; if ecx not equal to eax
jne begin_for_loop ; jmp to loop, else exit
mov esp,ebp
pop ebp
ret
Ожидаемый результат:
$ ./asm5 me you them us
Arguments = ./asm5
Arguments = me
Arguments = you
Arguments = them
Arguments = us
Сомнительный вывод:
$ ./asm5 me you them us *
Arguments = ./asm5
Arguments = me
Arguments = you
Arguments = them
Arguments = us
Arguments = asm1
Arguments = asm1.asm
Arguments = asm1.o
Arguments = asm2
Arguments = asm2.asm
Arguments = asm3
Arguments = asm3.asm
Arguments = asm4
Arguments = asm4.asm
Arguments = asm5
Arguments = asm5.asm
Arguments = asm-template.asm
Arguments = compile-asm.sh
Arguments = cpp_libs