| # 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 |