format ELF64
public _start
section '.bss' writable
bss_char rb 1
section '.text' executable
_start:
mov rax, 571
call print_number
; call print_line
; rax | rdx
; 571/10 = 57 | 1
; 57/10 5 | 7
; 5/10 = 0 | 5
;
section '.print_number' executable
; | input
; rax => number
print_number:
push rax
push rbx
push rcx
push rdx
xor rcx, rcx
.next_iter:
cmp rax, 0
je .print_iter
mov rbx, 10
xor rdx, rdx
add rdx, '0' ; результат деления занесён в rdx и к нему прибавляем символ '0'
push rdx
inc rcx
jmp .next_iter
.print_iter:
cmp rcx, 0
je .close
pop rax
call print_char
dec rcx
jmp .print_iter
.close:
pop rdx
pop rcx
pop rbx
pop rax
ret
section '.print_char' executable
print_char:
push rax
push rbx
push rcx
push rdx
; rax = 32|eax = 16|ax = ah|al
mov [bss_char], al
mov rax, 4
mov rbx, 1
mov rcx, bss_char
mov rdx, 1
int 0x80 ; это команда для 32-хбитной арх-ры,но подходит и для 64-х
pop rdx
pop rbx
pop rcx
pop rax
ret
section '.print_line' executable
print_line:
push rax
mov rax, 0xA
call print_char
pop rax
ret
section '.exit' executable
mov rax, 1
xor rbx, rbx
int 0x80
Zm9ybWF0IEVMRjY0CnB1YmxpYyBfc3RhcnQKCgpzZWN0aW9uICcuYnNzJyB3cml0YWJsZQogICAgYnNzX2NoYXIgcmIgMQogICAgCnNlY3Rpb24gJy50ZXh0JyBleGVjdXRhYmxlCl9zdGFydDoKICAgIG1vdiByYXgsIDU3MQogICAgY2FsbCBwcmludF9udW1iZXIKOyAgICBjYWxsIHByaW50X2xpbmUKICAgIGNhbGwgZXhpdCAgCiAKOyAgICAgICAgIHJheCB8IHJkeAo7IDU3MS8xMCA9IDU3IHwgMQo7IDU3LzEwIDUgfCA3CjsgNS8xMCA9IDAgfCA1CjsKCnNlY3Rpb24gJy5wcmludF9udW1iZXInIGV4ZWN1dGFibGUKOyB8IGlucHV0CjsgcmF4ID0+IG51bWJlcgpwcmludF9udW1iZXI6CiAgICBwdXNoIHJheAogICAgcHVzaCByYngKICAgIHB1c2ggcmN4CiAgICBwdXNoIHJkeAogICAgeG9yIHJjeCwgcmN4CiAgICAubmV4dF9pdGVyOgogICAgICAgIGNtcCByYXgsIDAKICAgICAgICBqZSAucHJpbnRfaXRlcgogICAgICAgIG1vdiByYngsIDEwCiAgICAgICAgeG9yIHJkeCwgcmR4CiAgICAgICAgZGl2IHJieCAgICAgOyByYXgvcmJ4CiAgICAgICAgYWRkIHJkeCwgJzAnIDsg0YDQtdC30YPQu9GM0YLQsNGCINC00LXQu9C10L3QuNGPINC30LDQvdC10YHRkdC9INCyIHJkeCDQuCDQuiDQvdC10LzRgyDQv9GA0LjQsdCw0LLQu9GP0LXQvCDRgdC40LzQstC+0LsgJzAnCiAgICAgICAgcHVzaCByZHgKICAgICAgICBpbmMgcmN4CiAgICAgICAgam1wIC5uZXh0X2l0ZXIKICAgLnByaW50X2l0ZXI6CiAgICAgICAgY21wIHJjeCwgMAogICAgICAgIGplIC5jbG9zZQogICAgICAgIHBvcCByYXgKICAgICAgICBjYWxsIHByaW50X2NoYXIKICAgICAgICBkZWMgcmN4CiAgICAgICAgam1wIC5wcmludF9pdGVyCiAgICAuY2xvc2U6CiAgICAgICAgcG9wIHJkeAogICAgICAgIHBvcCByY3gKICAgICAgICBwb3AgcmJ4CiAgICAgICAgcG9wIHJheAogICAgICAgIHJldAoKc2VjdGlvbiAnLnByaW50X2NoYXInIGV4ZWN1dGFibGUKICAgIHByaW50X2NoYXI6CiAgICBwdXNoIHJheAogICAgcHVzaCByYngKICAgIHB1c2ggcmN4CiAgICBwdXNoIHJkeAo7IHJheCA9IDMyfGVheCA9IDE2fGF4ID0gYWh8YWwKICAgIG1vdiBbYnNzX2NoYXJdLCBhbAogICAgbW92IHJheCwgNAogICAgbW92IHJieCwgMQogICAgbW92IHJjeCwgYnNzX2NoYXIKICAgIG1vdiByZHgsIDEKICAgIGludCAweDgwIDsg0Y3RgtC+INC60L7QvNCw0L3QtNCwINC00LvRjyAzMi3RhdCx0LjRgtC90L7QuSDQsNGA0YUt0YDRiyzQvdC+INC/0L7QtNGF0L7QtNC40YIg0Lgg0LTQu9GPIDY0LdGFCiAgICBwb3AgcmR4CiAgICBwb3AgcmJ4CiAgICBwb3AgcmN4CiAgICBwb3AgcmF4ICAgIAogICAgcmV0CgpzZWN0aW9uICcucHJpbnRfbGluZScgZXhlY3V0YWJsZQpwcmludF9saW5lOgogICAgcHVzaCByYXgKICAgIG1vdiByYXgsIDB4QQogICAgY2FsbCBwcmludF9jaGFyCiAgICBwb3AgcmF4CiAgICByZXQKICAgIApzZWN0aW9uICcuZXhpdCcgZXhlY3V0YWJsZQpleGl0OgogICAgbW92IHJheCwgMQogICAgeG9yIHJieCwgcmJ4CiAgICBpbnQgMHg4MA==
prog.asm:1: error: parser: instruction expected
prog.asm:2: error: parser: instruction expected
prog.asm:5: warning: Unknown section attribute 'writable' ignored on declaration of section `'.bss''
prog.asm:6: error: parser: instruction expected
prog.asm:8: warning: Unknown section attribute 'executable' ignored on declaration of section `'.text''
prog.asm:21: warning: Unknown section attribute 'executable' ignored on declaration of section `'.print_number''
prog.asm:54: warning: Unknown section attribute 'executable' ignored on declaration of section `'.print_char''
prog.asm:73: warning: Unknown section attribute 'executable' ignored on declaration of section `'.print_line''
prog.asm:81: warning: Unknown section attribute 'executable' ignored on declaration of section `'.exit''
ld: cannot find prog.o: No such file or directory