Сборка Linux; список аргументов собирается сойти - PullRequest
0 голосов
/ 20 августа 2011

Я новичок в программировании на любой сборке, и, поскольку я слышал, что сборка NASM-типа для Linux сравнительно проста для сборки на основе DOS, я решил попробовать.

На данный момент это моя программа:

section .data
    opening:    db  'Opening file...',10
    openingLen: equ $-opening
    opened:     db  'File opened.',10
    openedLen:  equ $-opened
    bad_params: db  'Usage: writeFile filename.ext',10
    bad_paramsLen:  equ $-bad_params
    not_opened: db  'Unable to open file.  Halted.',10
    not_openedLen:  equ $-not_opened
    hello:      db  'Hello, this is written to a file'
    helloLen:   equ $-hello
    success:    db  'Successfully wrote to file.',10
    successLen: equ $-success

section .bss
    file:       resd    1

section .text
    global _start:

_start:
    pop ebx             ; pop number of params
    test ebx,2          ; make sure there are only 2
    jne bad_param_list
    pop ebx

    mov eax,4           ; write out opening file msg
    mov ebx,1
    mov ecx,opening
    mov edx,openingLen
    int 80h

    mov eax,5           ; open file
    pop ebx
    mov ecx,64 
    mov edx,777o            ; permissions of file
    int 80h
    mov dword [file],eax

    test dword [file],0
    jle bad_open

    mov eax,4           ; write successful open message
    mov ebx,1
    mov ecx,opened
    mov edx,openedLen
    int 80h

    mov ebx,file            ; write to file (4 already in eax)
    mov ecx,hello
    mov edx,helloLen
    int 80h

    mov eax,6           ; close file
    mov ebx,file
    int 80h

    mov eax,4           ; write successfully written msg
    mov ebx,1
    mov ecx,success
    mov edx,successLen
    int 80h

    mov eax,1           ; exit
    mov ebx,0
    int 80h

bad_param_list:
    mov eax,4           ; write that params are bad
    mov ebx,1
    mov ecx,bad_params
    mov edx,bad_paramsLen
    int 80h

    mov eax,1           ; exit with code 1
    mov ebx,1
    int 80h

bad_open:
    mov eax,4           ; write that we couldn't open the file
    mov ebx,1
    mov ecx,not_opened
    mov edx,not_openedLen
    int 80h

    mov eax,1           ; exit with code 2
    mov ebx,2
    int 80h

Цель - записать строку текста в файл без библиотечных функций;Я использую только ядро ​​Linux.У меня было несколько проблем с отсутствующими скобками тут и там, и со всеми остальными ошибками, которые вы ожидаете от новичка до сборки, но я думаю, что теперь это в основном под контролем.

Вот моя проблема: насколько я знаю, первые четыре строки этой программы должны вытолкнуть количество аргументов из стека, перейти к bad_param_list, если нет только одного параметра (кроме имени программы) и вытолкнуть имя программы из стека.

Но это не то, что происходит.Вот некоторый пример ввода / вывода, переформатированный для ясности:

$./writeFile
Opening file...
Unable to open file.  Halted.

$./writeFile x
Usage:  writeFile filename.ext

$./writeFile x x
Usage:  writeFile filename.ext

$./writeFile x x x
Opening file...
Unable to open file.  Halted.

$./writeFile x x x x
Opening file...
Unable to open file.  Halted.

$./writeFile x x x x x
Usage:  writeFile filename.ext

$./writeFile x x x x x x
Usage:  writeFile filename.ext

Что я заметил, так это то, что если вы берете количество аргументов, включая имя программы, делите на 2 и отбрасываете десятичное число,если ответ нечетный, вы получите мою ошибку использования, но если ответ четный, вы получите ошибку, которую невозможно открыть.Это верно, по крайней мере, до 10 аргументов!

Как, черт возьми, мне удалось это сделать?И как мне получить ожидаемый результат?

1 Ответ

0 голосов
/ 21 августа 2011

вместо

test ebx,2

хочешь

cmp ebx,2

test выполняет побитовое И между аргументами и отбрасывает результат, за исключением установки флагов. Так, в частности, ZF будет установлен, если два аргумента не имеют 1-бит в совпадающих позициях. (В вашем конкретном случае это работает как установка ZF в дополнение к младшему биту ebx).

И наоборот cmp вычитает свои аргументы и выбрасывает результат после установки флагов. В этом случае ZF будет установлен, если два аргумента равны равны .

...