; Simon Whitehead
section .data
newline db 10
number dd 123456789 ; The number to print
; Syscall information
sys_exit equ 1
sys_write equ 4
; Streams
stdout equ 1
; Constants
BUFFER_SIZE equ 10
section .bss
numbuf resb BUFFER_SIZE ; A buffer to store our string of numbers in
section .text
global _start
_start:
mov rdi,[number] ; Move the number (123456789) into rax
call
itoa ; call the
function
; Write the string returned in rax out to stdout
mov rdi,rax ; The string pointer is returned in rax - move it to rdi for the function call
mov rsi,rcx
call print
; Write the newline character to stdout
mov rdi,newline
mov rsi,1
call print
; Exit
mov rax,sys_exit
mov rbx,0
int 0x80
; Args: (rdi: char*, rsi: int)
print:
mov rax,sys_write
mov rbx,stdout
mov rcx,rdi
mov rdx,rsi
int 0x80
ret
push rbp
mov rbp,rsp
sub rsp,4 ; allocate 4 bytes for our local string length counter
mov rax,rdi ; Move the passed in argument to rax
lea rdi,[numbuf+10] ; load the end address of the buffer (past the very end)
mov rcx,10 ; divisor
mov [rbp-4],dword 0 ; rbp-4 will contain 4 bytes representing the length of the string - start at zero
.divloop:
xor rdx,rdx ; Zero out rdx (where our remainder goes after idiv)
idiv rcx ; divide rax (the number) by 10 (the remainder is placed in rdx)
add rdx,0x30 ; add 0x30 to the remainder so we get the correct ASCII value
dec rdi ; move the pointer backwards in the buffer
mov byte [rdi],dl ; move the character into the buffer
inc dword [rbp-4] ; increase the length
cmp rax,0 ; was the quotient zero?
jnz .divloop ; no it wasn't, keep looping
mov rax,rdi ; rdi now points to the beginning of the string - move it into rax
mov rcx,[rbp-4] ; rbp-4 contains the length - move it into rcx
leave ; clean up our stack
ret
OyBTaW1vbiBXaGl0ZWhlYWQKCnNlY3Rpb24gLmRhdGEKCiAgICBuZXdsaW5lIGRiIDEwCgogICAgbnVtYmVyIGRkIDEyMzQ1Njc4OQk7IFRoZSBudW1iZXIgdG8gcHJpbnQKCiAgICA7IFN5c2NhbGwgaW5mb3JtYXRpb24KICAgIHN5c19leGl0IGVxdSAxCiAgICBzeXNfd3JpdGUgZXF1IDQKCiAgICA7IFN0cmVhbXMKICAgIHN0ZG91dCBlcXUgMQoKICAgIDsgQ29uc3RhbnRzCiAgICBCVUZGRVJfU0laRSBlcXUgMTAKCnNlY3Rpb24gLmJzcwoKICAgIG51bWJ1ZiByZXNiIEJVRkZFUl9TSVpFCQk7IEEgYnVmZmVyIHRvIHN0b3JlIG91ciBzdHJpbmcgb2YgbnVtYmVycyBpbgoKc2VjdGlvbiAudGV4dAoKZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgoKICAgIG1vdiByZGksW251bWJlcl0JOyBNb3ZlIHRoZSBudW1iZXIgKDEyMzQ1Njc4OSkgaW50byByYXgKICAgIGNhbGwgaXRvYQkJCTsgY2FsbCB0aGUgZnVuY3Rpb24KCiAgICA7IFdyaXRlIHRoZSBzdHJpbmcgcmV0dXJuZWQgaW4gcmF4IG91dCB0byBzdGRvdXQKICAgIG1vdiByZGkscmF4CQk7IFRoZSBzdHJpbmcgcG9pbnRlciBpcyByZXR1cm5lZCBpbiByYXggLSBtb3ZlIGl0IHRvIHJkaSBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwKICAgIG1vdiByc2kscmN4CiAgICBjYWxsIHByaW50CgogICAgOyBXcml0ZSB0aGUgbmV3bGluZSBjaGFyYWN0ZXIgdG8gc3Rkb3V0CiAgICBtb3YgcmRpLG5ld2xpbmUKICAgIG1vdiByc2ksMQogICAgY2FsbCBwcmludAogICAgCiAgIDsgRXhpdAogICAgbW92IHJheCxzeXNfZXhpdAogICAgbW92IHJieCwwCgogICAgaW50IDB4ODAKCjsgQXJnczogKHJkaTogY2hhciosIHJzaTogaW50KQpwcmludDoKICAgIAogICAgbW92IHJheCxzeXNfd3JpdGUKICAgIG1vdiByYngsc3Rkb3V0CiAgICBtb3YgcmN4LHJkaQogICAgbW92IHJkeCxyc2kKCiAgICBpbnQgMHg4MAoKICAgIHJldAoKaXRvYToKCiAgICBwdXNoIHJicAkJCiAgICBtb3YgcmJwLHJzcAogICAgc3ViIHJzcCw0CQk7IGFsbG9jYXRlIDQgYnl0ZXMgZm9yIG91ciBsb2NhbCBzdHJpbmcgbGVuZ3RoIGNvdW50ZXIKCiAgICBtb3YgcmF4LHJkaQkJOyBNb3ZlIHRoZSBwYXNzZWQgaW4gYXJndW1lbnQgdG8gcmF4CiAgICBsZWEgcmRpLFtudW1idWYrMTBdCTsgbG9hZCB0aGUgZW5kIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAocGFzdCB0aGUgdmVyeSBlbmQpCiAgICBtb3YgcmN4LDEwCQk7IGRpdmlzb3IKICAgIG1vdiBbcmJwLTRdLGR3b3JkIDAJOyByYnAtNCB3aWxsIGNvbnRhaW4gNCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIC0gc3RhcnQgYXQgemVybwoKLmRpdmxvb3A6CiAgICB4b3IgcmR4LHJkeAkJOyBaZXJvIG91dCByZHggKHdoZXJlIG91ciByZW1haW5kZXIgZ29lcyBhZnRlciBpZGl2KQogICAgaWRpdiByY3gJCTsgZGl2aWRlIHJheCAodGhlIG51bWJlcikgYnkgMTAgKHRoZSByZW1haW5kZXIgaXMgcGxhY2VkIGluIHJkeCkKICAgIGFkZCByZHgsMHgzMAk7IGFkZCAweDMwIHRvIHRoZSByZW1haW5kZXIgc28gd2UgZ2V0IHRoZSBjb3JyZWN0IEFTQ0lJIHZhbHVlCiAgICBkZWMgcmRpCQk7IG1vdmUgdGhlIHBvaW50ZXIgYmFja3dhcmRzIGluIHRoZSBidWZmZXIKICAgIG1vdiBieXRlIFtyZGldLGRsCTsgbW92ZSB0aGUgY2hhcmFjdGVyIGludG8gdGhlIGJ1ZmZlcgogICAgaW5jIGR3b3JkIFtyYnAtNF0JOyBpbmNyZWFzZSB0aGUgbGVuZ3RoCiAgICAKICAgIGNtcCByYXgsMAkJOyB3YXMgdGhlIHF1b3RpZW50IHplcm8/CiAgICBqbnogLmRpdmxvb3AJOyBubyBpdCB3YXNuJ3QsIGtlZXAgbG9vcGluZwoKICAgIG1vdiByYXgscmRpCQk7IHJkaSBub3cgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyAtIG1vdmUgaXQgaW50byByYXgKICAgIG1vdiByY3gsW3JicC00XQk7IHJicC00IGNvbnRhaW5zIHRoZSBsZW5ndGggLSBtb3ZlIGl0IGludG8gcmN4CgogICAgbGVhdmUJCTsgY2xlYW4gdXAgb3VyIHN0YWNrCiAgICByZXQK