############################################################################### # xxx.s ############################################################################### .code16 # código de 16 bits .text # sección de código ############################################ # constantes ############################################ .set COLUMNAS,80 .set FILAS,24 .set VIDEO,0xb800 ############################################ # variables ############################################ x: .byte 0 y: .byte 0 ############################################# # void goto(unsigned char x, unsigned char y) ############################################# goto: push %bp mov %sp, %bp mov $VIDEO, %ax mov %ax,%es # es = VIDEO movw 4(%bp), %ax # ax = y movb $COLUMNAS, %bl # bl = 80 mulb %bl # ax *= 80 addb 6(%bp), %al # ax += x mov %ax,%di pop %bp ret scroll: xor $VIDEO,%ax mov %ax,%ds mov %ax,%es xor %si,%si mov $COLUMNAS,%di movb $0xf,%ah movb $' ',%al mov $((FILAS - 1) * COLUMNAS),%cx rep movsw movb $0,x movb $(FILAS - 1),y ret ##################################################### # void putc(char c) ##################################################### putc: push %bp mov %sp,%bp push x push y call goto # di = 80 * y + x add $4,%sp mov $0xc, %ah # color rojo movb 4(%bp),%al # carácter stosw # carácter+color --> memoria de video incb x cmpb $COLUMNAS,x jb .Lfin movb $0,x incb y cmpb $FILAS,y jb .Lfin call scroll .Lfin: pop %bp ret ##################################################### # void puts(char *str) ##################################################### puts: push %bp mov %sp,%bp xor %ax,%ax mov %ax,%ds mov 4(%bp),%si .Lsiguiente: lod pop %bp ret ##################################################### # void reset() ##################################################### reset: xor %ax, %ax mov %ax, x # x = 0 mov %ax, y # y = 0 ret ######################################################### # _start ######################################################### _start: .globl _start xor %ax, %ax # 0 --> ax | mov %ax, %ds # ax --> ds | msg --> ds:si mov $msg, %si # msg --> si | mov %ax,%ss # 0 --> ss | mov $0x9c00, %sp # 0x9c00 --> sp | pila --> ss:sp call reset mov $0x0c, %ah # color rojo mov len, %cx # nº de caracteres sig: mov %ds:(%si), %al # ds(si) --> al inc %si mov %ax, %es:(%di) # ax --> es(di) add $2, %di loop sig # decrementa cx y salta si no 0 cli hlt msg: .ascii "cogito, ergo sum!" len: .int . - msg .org 510 # saltar 510 bytes .word 0xAA55 # firma del sector de arranque