4 ms·
This can be done even simpler: global _start _start: jmp next string: db `Hello World!\n` len: equ $ - string next: mov ecx, string
by higherhalf 3y ago
This can be done even simpler:
global _start
_start:
jmp next
string:
db `Hello World!\n`
len: equ $ - string
next:
mov ecx, string
mov edx, len
mov ebx, 1
mov eax, 4
int 80h
mov ebx, 0
mov eax, 1
int 80h
For NASM, it can also be put into a macro, for example printing to video memory at 0xb8000:
%macro print 1
mov ecx, %%loop_start - %%strdata
mov eax, 0x0700
jmp %%loop_start
%%strdata: db %1
%%loop_start:
mov al, [%%strdata + ecx - 1]
mov [0xb8000 + ecx * 2 - 2], ax
loop %%loop_start
%endmacro
- projektfu 3y agoThat will require a fixup or a fixed load address. The example in the article is position independent.
- fargle 3y agothe author wanted it to be position-independent (PIC), so it works no matter what address the .text segment is loaded to and run. This example uses a fixed symbolic reference ("string:") and is the normal way to do it. The trick is to it in a PC relative way.