1*bb4ee6a4SAndroid Build Coastguard Worker# Copyright 2022 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker# found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker# Build instructions: 6*bb4ee6a4SAndroid Build Coastguard Worker# x86_64-linux-gnu-as test_elf.S -o test_elf.o 7*bb4ee6a4SAndroid Build Coastguard Worker# x86_64-linux-gnu-ld test_elf.o -o test_elf.bin -T test_elf.ld 8*bb4ee6a4SAndroid Build Coastguard Worker 9*bb4ee6a4SAndroid Build Coastguard Worker .intel_syntax noprefix 10*bb4ee6a4SAndroid Build Coastguard Worker 11*bb4ee6a4SAndroid Build Coastguard Worker .section .rodata 12*bb4ee6a4SAndroid Build Coastguard Workerhello_world: 13*bb4ee6a4SAndroid Build Coastguard Worker .string "Hello world!\n" 14*bb4ee6a4SAndroid Build Coastguard Worker .set hello_size, .-hello_world 15*bb4ee6a4SAndroid Build Coastguard Worker 16*bb4ee6a4SAndroid Build Coastguard Worker .text 17*bb4ee6a4SAndroid Build Coastguard Worker .globl _start 18*bb4ee6a4SAndroid Build Coastguard Worker_start: 19*bb4ee6a4SAndroid Build Coastguard Worker lea rsi, [rip + hello_world] # rsi -> message string 20*bb4ee6a4SAndroid Build Coastguard Worker mov rcx, hello_size # rcx = length of message 21*bb4ee6a4SAndroid Build Coastguard Worker mov dx, 0x3F8 # dx = COM1 port 22*bb4ee6a4SAndroid Build Coastguard Worker 23*bb4ee6a4SAndroid Build Coastguard Worker.print_loop: 24*bb4ee6a4SAndroid Build Coastguard Worker # Wait for the transmit buffer to be empty by polling the line status. 25*bb4ee6a4SAndroid Build Coastguard Worker add dx, 5 # dx = line status register 26*bb4ee6a4SAndroid Build Coastguard Worker.wait_empty: 27*bb4ee6a4SAndroid Build Coastguard Worker in al, dx # read line status 28*bb4ee6a4SAndroid Build Coastguard Worker test al, 0x20 # check buffer empty flag 29*bb4ee6a4SAndroid Build Coastguard Worker jz .wait_empty # keep waiting if flag is not set 30*bb4ee6a4SAndroid Build Coastguard Worker 31*bb4ee6a4SAndroid Build Coastguard Worker.wait_done: 32*bb4ee6a4SAndroid Build Coastguard Worker sub dx, 5 # dx = data register 33*bb4ee6a4SAndroid Build Coastguard Worker 34*bb4ee6a4SAndroid Build Coastguard Worker # Load a byte of the message and send it to the serial port. 35*bb4ee6a4SAndroid Build Coastguard Worker lodsb # load message byte from RSI to AL 36*bb4ee6a4SAndroid Build Coastguard Worker out dx, al # send byte to serial port 37*bb4ee6a4SAndroid Build Coastguard Worker dec rcx # rcx-- 38*bb4ee6a4SAndroid Build Coastguard Worker jnz .print_loop # repeat if rcx != 0 39*bb4ee6a4SAndroid Build Coastguard Worker 40*bb4ee6a4SAndroid Build Coastguard Worker.done: 41*bb4ee6a4SAndroid Build Coastguard Worker int3 # cause vcpu to exit 42