Gnu/linux:format ELF executable
entry start
;Comentarios con ;
segment readable executable
start:
mov eax, 4 ;Servicio 4, escribir
mov ebx, 1 ;manejador de STDOUT
mov ecx, msg ;el mensaje
mov edx, msg_len ;tamanio del mensaje
int 80h ;ejecuta la llamada al sistema
mov eax, 1 ;Servicio 1 termina el proceso
mov ebx, 0 ;envia 0 como código de salida
int 80h ;ejecuta la llamada al sistema
segment readable writable
msg db 'Hola Mundo',0 ;cadena
msg_len = $-msg ;tamaño de la cadena
Windows
include '..\fasm\include\win32ax.inc'
.data ;variables aqui
cuerpo db 'Hola mundo', 0
titulo db 'Saludo', 0
.code ;codigo
start:
push 0 ;parametros de MessageBoxA
push titulo
push cuerpo
push 0
call [MessageBoxA] ;llamamos al api
push 0
call [ExitProcess] ;llamando a ExitProcess con parametro 0
.end start
Ahora en 16 bits :D
;para crear un exe
format MZ
;estabilizando la pila
push cs
pop ds
mov ah, 9 ;el servicio que queremos usar, 9 para imprimir
mov dx,hello ;parametros
int 21h ;llamada a la int
mov ax,4C00h ;servicio 4Ch para salir
int 21h ;llamada a la int
hello db 'Hello world!', 24h ;cadena mensaje
Ahora en .Com
; Programa 16-bit COM
org 100h ; el codigo comienza en el offset 100h
use16 ; usando codigo 16-bit
mov ah, 9 ;llamando al servicio 9
mov dx, hello ;mensaje a imprimir
int 21h
;llamando a la int 21h
mov ax,4C00h ;servicio 4Ch para salir
int 21h ;llamada a la int
hello db 'Hello world!', 24h ;cadena mensaje
bytes ;) by Ni0!
Dejo un hello world para Turbo Assembler con string terminada en \0 para poder mezclarlo con C en MSDos:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Hello World ;;
;; ByAlmamu ;;
;; ForMSDOS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TITLE HELLOWORLD
JUMPS
.model small
.stack 100h
.data
hello db "Hello World!$",13,10
.code
.8086
start:
; Reseteamos el stack
mov ax,@data
mov ds, ax
mov es, ax
and sp, not 3
; Movemos hello al registro dx, usado en el int 21h
; para llevar la informacion del mensaje
mov dx, offset hello
; Elejimos la acción que vamos a realizar, en este caso escribir en pantalla
mov ah, 9h ; 9->escribir en pantalla
; Creamos interrupcion de software 21 para que se escriba en pantalla
int 21h
; Finalizamos el programa y lo cerramos para evitar bucle infinito
mov ax, 4c00h ; 4c->terminar, 00->errno
int 21h
end start