Я новичок в программировании на любой сборке, и, поскольку я слышал, что сборка 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 аргументов!
Как, черт возьми, мне удалось это сделать?И как мне получить ожидаемый результат?