section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
Ссылки на исходные коды ядра:
Как система узнает, что она должна выйти, когда она читает EAX, 1, а не EBX, 1? Поскольку 1 означает Sys_Exit.
int 0x80
в операционной системе ожидает код функции вeax
, так что вы должны поместить его туда. Не уверен, что вы не уверены, чтоmov eax,1
на самом деле закрывается, это не так, он просто загружает1
вeax
. Это ядро будет проверять значениеeax
после того, как вы вызовете его с помощьюint 0x80
. - person Jester   schedule 20.01.2016sys_write
требует дополнительной информации, которая находится вebx
,ecx
иedx
. Загрузкаmov ebx,1
не имеет ничего общего с более позднимmov eax,1
, который определяет функциюsys_exit
. - person Weather Vane   schedule 20.01.2016eax
,ebx
,ecx
и т. Д.) Является отдельным независимым местом, где может храниться число. Многие внешние функции (например, вызовы прерывания операционной системы) имеют соглашение о видах информации, хранящейся в определенных регистрах. Некоторые регистры имеют особое функциональное значение или режимы использования также для самого микропроцессора. - person lurker   schedule 20.01.2016