Это x86 Linux (x86 не единственный язык ассемблера, и Linux не единственный Unix!) ...
section .data
textoutput db 'Hello world!', 10
lentext equ $ - textoutput
filetoopen db 'hi.txt'
Строка имени файла требует 0-байтовый терминатор: filetoopen db 'hi.txt', 0
section .text
global _start
_start:
mov eax, 5 ;open
mov ebx, filetoopen
mov ecx, 2 ;read and write mode
2
- это флаг O_RDWR
для системного вызова open
. Если вы хотите, чтобы файл был создан, если он еще не существует, вам также понадобится флаг O_CREAT
; и если вы укажете O_CREAT
, вам понадобится третий аргумент, который является режимом разрешений для файла. Если вы покопаетесь в заголовках C, вы обнаружите, что O_CREAT
определяется как 0100
- остерегайтесь начального нуля: это восьмеричная константа! Вы можете написать восьмеричные константы в nasm
, используя суффикс o
.
Так что вам нужно что-то вроде mov ecx, 0102o
, чтобы получить правильные флаги и mov edx, 0666o
, чтобы установить разрешения.
int 80h
Код возврата из системного вызова передается в eax
. Здесь это будет дескриптор файла (если открытие было успешным) или небольшое отрицательное число, которое является отрицательным кодом errno
(например, -1 для EPERM
). Обратите внимание, что соглашение для возврата кодов ошибок из необработанного системного вызова - , а не , в точности то же самое, что и для оболочек системного вызова C (которые обычно возвращают -1
и устанавливают errno
в случае ошибки) ...
mov eax, 4
mov ebx, filetoopen ;I'm not sure what do i have to put here, what is the "file descriptor"?
... так что здесь вам нужно сначала mov ebx, eax
(чтобы сохранить результат open
до перезаписи eax
), затем mov eax, 4
. (Вы можете подумать о том, чтобы сначала проверить, был ли результат положительным, и как-то обработать сбой открытия, если это не так.)
mov ecx, textoutput
mov edx, lentext
Отсутствует int 80h
здесь.
mov eax, 1
mov ebx, 0
int 80h ; finish without errors