| # Copyright 2022 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # Build instructions: | |
| # x86_64-linux-gnu-as test_elf.S -o test_elf.o | |
| # x86_64-linux-gnu-ld test_elf.o -o test_elf.bin -T test_elf.ld | |
| .intel_syntax noprefix | |
| .section .rodata | |
| hello_world: | |
| .string "Hello world!\n" | |
| .set hello_size, .-hello_world | |
| .text | |
| .globl _start | |
| _start: | |
| lea rsi, [rip + hello_world] # rsi -> message string | |
| mov rcx, hello_size # rcx = length of message | |
| mov dx, 0x3F8 # dx = COM1 port | |
| .print_loop: | |
| # Wait for the transmit buffer to be empty by polling the line status. | |
| add dx, 5 # dx = line status register | |
| .wait_empty: | |
| in al, dx # read line status | |
| test al, 0x20 # check buffer empty flag | |
| jz .wait_empty # keep waiting if flag is not set | |
| .wait_done: | |
| sub dx, 5 # dx = data register | |
| # Load a byte of the message and send it to the serial port. | |
| lodsb # load message byte from RSI to AL | |
| out dx, al # send byte to serial port | |
| dec rcx # rcx-- | |
| jnz .print_loop # repeat if rcx != 0 | |
| .done: | |
| int3 # cause vcpu to exit |