Moving and consolidating repos
This commit is contained in:
BIN
x86_64/Basic Mathematic Computations/elementary/addition/add
Executable file
BIN
x86_64/Basic Mathematic Computations/elementary/addition/add
Executable file
Binary file not shown.
@@ -0,0 +1,34 @@
|
||||
section .data
|
||||
msg db 'Result: ', 0 ; declare string, followed by null terminator
|
||||
newline db 0xA, 0 ; Newline character for format
|
||||
section .bss
|
||||
res resb 1 ; reserve 1 byte of memory for storing Result
|
||||
section .text
|
||||
global _start ; Define the entry point of the program
|
||||
_start:
|
||||
; Initialize values
|
||||
mov eax, 4 ; Move the value 4 into register eax
|
||||
mov ebx, 3 ; move the value 3 into register ebx
|
||||
; Perform the addition
|
||||
add eax, ebx ; add the values of eax n ebx register, store the result in eax
|
||||
; Convert the result to ASCII
|
||||
mov ecx, res ; point ecx to the start of the result buffer
|
||||
add eax, '0' ; convert the result in eax to ASCII
|
||||
mov [ecx], al ; Store the ASCII character in the result buffer
|
||||
mov byte [ecx+1], 0 ; Null terminate the string
|
||||
; print the string
|
||||
mov eax, 4 ; Syscall number for sys_write
|
||||
mov ebx, 1 ; File descripor for stdout
|
||||
mov ecx, msg ; point to the msg string defined prior
|
||||
mov edx, 8 ; Length of the message storing
|
||||
int 0x80 ; Interrupt to invoke syscall, call the kernel
|
||||
; print the result
|
||||
mov eax, 4 ; syscall for sys_write
|
||||
mov ebx, 1 ; file desciptor, stdout
|
||||
mov ecx, res ; pointer to the result in memory
|
||||
mov edx, 1 ; length of the result
|
||||
int 0x80 ; interupt to invoke the systemcall
|
||||
; exit, cleanly
|
||||
mov eax, 1 ; syscall for sys_exit
|
||||
xor ebx, ebx ; set ebx to 0 (return)
|
||||
int 0x80 ; interupt to invoke the syscall
|
||||
BIN
x86_64/Basic Mathematic Computations/elementary/addition/add.o
Normal file
BIN
x86_64/Basic Mathematic Computations/elementary/addition/add.o
Normal file
Binary file not shown.
BIN
x86_64/Basic Mathematic Computations/elementary/addition/add_adv
Executable file
BIN
x86_64/Basic Mathematic Computations/elementary/addition/add_adv
Executable file
Binary file not shown.
Binary file not shown.
2
x86_64/Hello/assemble.txt
Normal file
2
x86_64/Hello/assemble.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
nasm -f elf64 -o output.o input.asm
|
||||
ld input.o -o binary
|
||||
BIN
x86_64/Hello/hello34
Executable file
BIN
x86_64/Hello/hello34
Executable file
Binary file not shown.
18
x86_64/Hello/hello34.asm
Normal file
18
x86_64/Hello/hello34.asm
Normal file
@@ -0,0 +1,18 @@
|
||||
section .data
|
||||
hello db "Hello, World!", 10 ; The string to print, with a new line terminator
|
||||
|
||||
section .text
|
||||
global _start ; The entry point for the program
|
||||
|
||||
_start:
|
||||
; Write the string to stdout
|
||||
mov eax, 4 ; sys_write system call number
|
||||
mov ebx, 1 ; File descriptor (stdout)
|
||||
mov ecx, hello ; Pointer to the string
|
||||
mov edx, 13 ; Length of the string
|
||||
int 0x80 ; Call the kernel
|
||||
|
||||
; Exit the program
|
||||
mov eax, 1 ; sys_exit system call number
|
||||
xor ebx, ebx ; Exit code 0
|
||||
int 0x80 ; Call the kernel
|
||||
BIN
x86_64/Hello/hello34.o
Normal file
BIN
x86_64/Hello/hello34.o
Normal file
Binary file not shown.
BIN
x86_64/Hello/hello64
Executable file
BIN
x86_64/Hello/hello64
Executable file
Binary file not shown.
16
x86_64/Hello/hello64.asm
Normal file
16
x86_64/Hello/hello64.asm
Normal file
@@ -0,0 +1,16 @@
|
||||
section .data
|
||||
hello db "Hello, World!", 10 ; Declared bits with a new line term (10)
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
mov rax, 1
|
||||
mov rdi, 1
|
||||
mov rsi, hello
|
||||
mov rdx, 14
|
||||
syscall
|
||||
|
||||
mov rax, 60
|
||||
mov rdi, 0
|
||||
syscall
|
||||
BIN
x86_64/Hello/hello64.o
Normal file
BIN
x86_64/Hello/hello64.o
Normal file
Binary file not shown.
BIN
x86_64/Hello/hello64_exe
Executable file
BIN
x86_64/Hello/hello64_exe
Executable file
Binary file not shown.
BIN
x86_64/Hello/hello64_exe.o
Normal file
BIN
x86_64/Hello/hello64_exe.o
Normal file
Binary file not shown.
BIN
x86_64/Input Output Scripts/Basic IO/basic_io
Executable file
BIN
x86_64/Input Output Scripts/Basic IO/basic_io
Executable file
Binary file not shown.
39
x86_64/Input Output Scripts/Basic IO/basic_io.asm
Normal file
39
x86_64/Input Output Scripts/Basic IO/basic_io.asm
Normal file
@@ -0,0 +1,39 @@
|
||||
sction .data
|
||||
prompt db 'Please enter your name: ', 0 ; Null-terminated prompt message
|
||||
promptLen equ $ - prompt ; Length of the prompt message
|
||||
|
||||
buffer db 128 dup(0) ; Buffer for the input
|
||||
bufferLen equ 128 ; Maximum buffer length
|
||||
|
||||
section .bss
|
||||
name resb 128 ; Reserve buffer for name
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
; Print prompt
|
||||
mov eax, 4 ; sys_write syscall
|
||||
mov ebx, 1 ; File descriptor 1 - stdout
|
||||
mov ecx, prompt ; Pointer to the message to print
|
||||
mov edx, promptLen ; Message length
|
||||
int 0x80 ; Call the kernel
|
||||
|
||||
; Read input
|
||||
mov eax, 3 ; sys_read syscall
|
||||
mov ebx, 0 ; File descriptor 0 - stdin
|
||||
mov ecx, buffer ; Pointer to the input buffer
|
||||
mov edx, bufferLen ; Maximum number of bytes to read
|
||||
int 0x80 ; Call the kernel
|
||||
|
||||
; Print greeting
|
||||
mov eax, 4 ; sys_write syscall
|
||||
mov ebx, 1 ; File descriptor 1 - stdout
|
||||
mov ecx, buffer ; Pointer to the buffer to print
|
||||
; Use the number of bytes read as the length to write
|
||||
int 0x80 ; Call the kernel
|
||||
|
||||
; Exit program
|
||||
mov eax, 1 ; sys_exit syscall
|
||||
xor ebx, ebx ; Exit code 0
|
||||
int 0x80 ; Call the kernel
|
||||
BIN
x86_64/Input Output Scripts/Basic IO/basic_io.o
Normal file
BIN
x86_64/Input Output Scripts/Basic IO/basic_io.o
Normal file
Binary file not shown.
BIN
x86_64/Input Output Scripts/Calculator/add
Executable file
BIN
x86_64/Input Output Scripts/Calculator/add
Executable file
Binary file not shown.
61
x86_64/Input Output Scripts/Calculator/addition.asm
Normal file
61
x86_64/Input Output Scripts/Calculator/addition.asm
Normal file
@@ -0,0 +1,61 @@
|
||||
section .data
|
||||
numberone db 'Enter fst number: ', 0 ; Null terminated string
|
||||
numbertwo db 'Enter snd number: ', 0 ; Null terminated string
|
||||
numonelen equ $ - numberone ; length of prompt 1
|
||||
numtwolen equ $ - numbertwo ; length of prompt 2
|
||||
|
||||
section .bss
|
||||
numone resb 128 ; reserve for number 1 input
|
||||
numtwo resb 128 ; reserve for number 2 input
|
||||
result resb 128 ; reserve for result of addition
|
||||
section .text
|
||||
global _start
|
||||
_start:
|
||||
; Number 1 prompt
|
||||
mov eax, 4 ; sys_write syscall in 32 bit registry eax
|
||||
mov ebx, 1 ; Stdout syscall in 32 bit registry ebx
|
||||
mov ecx, numberone ; move null terminated string to 32 bit registry ecx
|
||||
mov edx, numtwolen ; length of null terminated (value) moved to 32 bit registry edx
|
||||
int 0x80 ; Interrupt kernel, reset
|
||||
|
||||
; Number 1 Read
|
||||
mov eax, 3 ; Sys_read sysclal in 32 bit registry
|
||||
mov ebx, 0 ; stdin file descriptor in 32 bit regstry
|
||||
mov ecx, numone ; pointer for input
|
||||
mov edx, 128 ; maxomim number of bytes to Read
|
||||
int 0x80 ; Interrupt kernel, reset
|
||||
|
||||
; Number 2 prompt
|
||||
mov eax, 4
|
||||
mov ebx, 1
|
||||
mov ecx, numbertwo
|
||||
mov edx, numtwolen
|
||||
int 0x80
|
||||
|
||||
; Number 2 Read
|
||||
mov eax, 3
|
||||
mov ebx, 0
|
||||
mov ecx, numtwo
|
||||
mov edx, 128
|
||||
int 0x80
|
||||
|
||||
|
||||
; Print result
|
||||
mov eax, 4 ; Sys_write syscall for 32 bit register eax
|
||||
mov ebx, 1 ; Stdout
|
||||
mov ecx, numone
|
||||
int 0x80
|
||||
|
||||
mov eax, 4
|
||||
mov ebx, 1
|
||||
mov ecx, numtwo
|
||||
int 0x80
|
||||
|
||||
; exit
|
||||
mov eax, 1 ; sys_exit
|
||||
xor ebx, ebx ; exit with code 0
|
||||
int 0x80
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
x86_64/Input Output Scripts/Calculator/adds.o
Normal file
BIN
x86_64/Input Output Scripts/Calculator/adds.o
Normal file
Binary file not shown.
BIN
x86_64/Input Output Scripts/get_user_input/name
Executable file
BIN
x86_64/Input Output Scripts/get_user_input/name
Executable file
Binary file not shown.
49
x86_64/Input Output Scripts/get_user_input/name.asm
Normal file
49
x86_64/Input Output Scripts/get_user_input/name.asm
Normal file
@@ -0,0 +1,49 @@
|
||||
section .data
|
||||
prompt db "What is your name? ", 10
|
||||
output1 db "Hello, "
|
||||
|
||||
section .bss
|
||||
input resb 34
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
call _getInput
|
||||
call _printOutput1
|
||||
call _printInput
|
||||
mov rax, 60
|
||||
mov rdi, 0
|
||||
syscall
|
||||
|
||||
_getInput:
|
||||
mov rax, 0
|
||||
mov rdi, 0
|
||||
mov rsi, input
|
||||
mov rdx, 34 ; related to resb
|
||||
syscall
|
||||
ret
|
||||
|
||||
_printPrompt:
|
||||
mov rax, 1
|
||||
mov rdi, 1
|
||||
mov rsi, prompt
|
||||
mov rdx, 20 ; change for size of bytes reserved
|
||||
syscall
|
||||
ret
|
||||
|
||||
_printOutput1:
|
||||
mov rax, 1
|
||||
mov rdi, 1
|
||||
mov rsi, output1
|
||||
mov rdx, 7 ; change for size of db
|
||||
syscall
|
||||
ret
|
||||
|
||||
_printInput:
|
||||
mov rax, 1
|
||||
mov rdi, 1
|
||||
mov rsi, input
|
||||
mov rdx, 34 ; change for resb
|
||||
syscall
|
||||
ret
|
||||
BIN
x86_64/Input Output Scripts/get_user_input/name.o
Normal file
BIN
x86_64/Input Output Scripts/get_user_input/name.o
Normal file
Binary file not shown.
BIN
x86_64/Math-Operations/add/add
Executable file
BIN
x86_64/Math-Operations/add/add
Executable file
Binary file not shown.
221
x86_64/Math-Operations/add/add.asm
Normal file
221
x86_64/Math-Operations/add/add.asm
Normal file
@@ -0,0 +1,221 @@
|
||||
;----------------------------------------------------------------------------
|
||||
; Author: SL
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
[GLOBAL mystart] ; export the start address
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
[SECTION .text]
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
; code belongs in this section starting here
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
; MESSAGE is a macro displays a message for prompts.
|
||||
; The address of the $ terminated string is passed as the only parameter.
|
||||
|
||||
%macro MESSAGE 1
|
||||
push eax ; macro transparency
|
||||
push edx
|
||||
|
||||
mov ah, 09h ; select write string function
|
||||
mov edx, %1 ; load EDX with address of string
|
||||
int 0f1h ; call OS interrupt 0F1H
|
||||
|
||||
pop edx ; restore registers
|
||||
pop eax
|
||||
%endmacro
|
||||
mystart:
|
||||
;----------------------------------------------------------------------------
|
||||
; MAIN starts here
|
||||
|
||||
INF:
|
||||
MESSAGE msg1 ;callGETBASE for inital base
|
||||
call GETBASE
|
||||
cmp edi,0 ;check to see if it should quit
|
||||
je END
|
||||
|
||||
MESSAGE msg2 ;enter the number
|
||||
call ASCIIBIN
|
||||
cmp edi, 0
|
||||
je END
|
||||
push edi
|
||||
|
||||
MESSAGE msg3 ;second base
|
||||
call GETBASE
|
||||
cmp edi, 0
|
||||
je END
|
||||
|
||||
pop edi
|
||||
MESSAGE msg5 ;print answer
|
||||
mov ebx, OBU ;location of string in outbuffer
|
||||
mov eax, edi ;accum in edi mov to eax
|
||||
call BINASCII
|
||||
call CONOUT
|
||||
jmp INF
|
||||
END:
|
||||
ret
|
||||
|
||||
|
||||
GETBASE: mov ecx, 10 ; BASE 10
|
||||
mov edi, 0 ; set accum to 0
|
||||
call ASCIIBIN
|
||||
cmp edi, 2 ;cmp the upper and lower base limit
|
||||
jb END1
|
||||
cmp edi, 36
|
||||
ja END1
|
||||
mov ecx, edi ; move current base into accum
|
||||
ret
|
||||
|
||||
END1: mov ecx, 0
|
||||
ret
|
||||
|
||||
ASCIIBIN:
|
||||
mov edi, 0
|
||||
mov byte [buffer], 32 ; buffer can hold 32 characters
|
||||
mov byte [buffer+1], 0 ; reuse 0 characters from last input
|
||||
mov ah, 0ah ; select buffered input function
|
||||
mov edx, buffer ; put buffer address in EDX
|
||||
int 0f1h ; call OS interrupt 0F1H
|
||||
|
||||
movzx esi, byte [buffer+1] ;load ECX with number of characters read
|
||||
mov ebx, buffer+2 ;load address of input text into EBX
|
||||
|
||||
looop1: mov al, [ebx] ; load 1 byte from ebx address
|
||||
|
||||
inner: cmp al, '0'
|
||||
jb error2
|
||||
cmp al, '9'
|
||||
ja error1
|
||||
sub al, '0' ; subtract '0'
|
||||
jmp OK
|
||||
|
||||
error1: and al, 0DFh ; else and with DF
|
||||
cmp al, 'A'
|
||||
jb error2
|
||||
cmp al, 'Z'
|
||||
ja error2
|
||||
sub al,'A'-10 ; sub al"A"-10
|
||||
jmp OK
|
||||
|
||||
error2: MESSAGE msg4
|
||||
mov edi, 0 ;zeros out the accumulator
|
||||
ret
|
||||
|
||||
|
||||
OK: ;compare digit to base. If >, ERROR.
|
||||
movzx eax, al ; zero extend digit
|
||||
cmp eax, ecx ; cmp digit to base
|
||||
ja error2
|
||||
imul edi, ecx ; accum * base
|
||||
add edi, eax ; accum + digit
|
||||
|
||||
next: add ebx, 1 ; increment ebx
|
||||
sub esi, 1 ; decraments esi
|
||||
cmp esi, 0
|
||||
ja looop1 ; loop if it is above 0
|
||||
cmp edi, 2147483647 ;checks the upperbound
|
||||
ja error2
|
||||
cmp edi, 1 ;check lowerbound
|
||||
je error2
|
||||
cmp edi, -2147483647 ; check lower bound
|
||||
je error2
|
||||
cmp edi, -1 ;check upperbound
|
||||
je error2
|
||||
ret
|
||||
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
; CONOUT transfers byte characters from [EBX] to screen (console).
|
||||
; String at [EBX] must be null terminated.
|
||||
|
||||
CONOUT:
|
||||
push eax ; save regs for subroutine transparency
|
||||
push edx
|
||||
push esi
|
||||
|
||||
mov esi, ebx ; load ESI with address of buffer
|
||||
cld ; clear direction flage for forward scan
|
||||
mov ah, 02h ; select write character function
|
||||
loop1: lodsb ; get next byte (NB this loop could be
|
||||
test al, 0ffh ; test for null more efficiently coded!)
|
||||
jz done
|
||||
mov dl, al ; copy character into DL for function
|
||||
int 0f1h ; call OS interrupt 0F1H
|
||||
jmp loop1 ; ending in JMP is inefficient
|
||||
done:
|
||||
pop esi ; restore registers - transparency
|
||||
pop edx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
|
||||
; BINASCII routine to convert a 2's complement number passed in EAX, base in
|
||||
; ECX, into a null-terminated string of ASCII characters stored at [EBX].
|
||||
|
||||
BINASCII:
|
||||
push edx ; transparency
|
||||
push edi
|
||||
|
||||
mov edi, ebx ; put pointer to output string in EDI
|
||||
test eax, 0ffffffffh
|
||||
jns positive
|
||||
mov byte [edi], '-' ; store minus sign in output string
|
||||
inc edi
|
||||
|
||||
neg eax ; will this work OK with 8000000H?
|
||||
positive:
|
||||
push dword 0 ; push marker, keeping stack dword aligned
|
||||
looop:
|
||||
mov edx, 0 ; NOTE: HAD TO FIX THIS ONE, CUZ THE STUPID
|
||||
; INTEL CHIP INSISTS ON GENERATING A DIVIDE
|
||||
; ERROR EXCEPTION IF QUOTIENT TOO BIG!!!
|
||||
|
||||
div ecx ; divide base into R:Q where EDX will
|
||||
; contain the remainder and EAX the
|
||||
; dividend then quotient
|
||||
cmp edx, 9
|
||||
ja letter
|
||||
add edx, '0' ; most convenient to do ASCII conversion here
|
||||
; add ASCII '0'
|
||||
jmp puush ; so we can terminate our popping off stack
|
||||
letter:
|
||||
add edx, 'A'-10 ; easily: we can have digits of zero which
|
||||
; couldn't be distinguished from the marker
|
||||
puush:
|
||||
push edx ; push the character
|
||||
test eax, 0ffffffffh ; if quotient is zero we are done
|
||||
jnz looop
|
||||
|
||||
outloop:
|
||||
pop eax ; pop digits
|
||||
mov [edi], al ; and store
|
||||
inc edi ; the null is also popped and stored
|
||||
test al, 0ffh ; test for null
|
||||
jnz outloop
|
||||
|
||||
pop edi ; transparency
|
||||
pop edx
|
||||
ret
|
||||
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
[SECTION .data]
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
; all initialized data variables and constant definitions go here
|
||||
|
||||
msg1 db 13,10,"Enter a base number or Q to quit: ", 13, 10, "$"
|
||||
msg2 db 13,10,"Enter a Number: ", 13, 10, "$"
|
||||
msg3 db 13,10,"Enter the desired base: ", 13, 10, "$"
|
||||
msg4 db 13,10,"INVALID INPUT", 13, 10, "$"
|
||||
msg5 db 13,10,"Your Result is: ", 13, 10, "$"
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
[SECTION .bss]
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
; all uninitialized data elements go here
|
||||
|
||||
buffer resb 34 ; buffer to store input characters
|
||||
OBU resb 80 ; buffer to store output char
|
||||
BIN
x86_64/stack/stack
Executable file
BIN
x86_64/stack/stack
Executable file
Binary file not shown.
BIN
x86_64/stack/stack.o
Normal file
BIN
x86_64/stack/stack.o
Normal file
Binary file not shown.
168
x86_64/stack/stask.asm
Normal file
168
x86_64/stack/stask.asm
Normal file
@@ -0,0 +1,168 @@
|
||||
section .data
|
||||
SYS_WRITE equ 1
|
||||
STD_IN equ 1
|
||||
SYS_EXIT equ 60
|
||||
EXIT_CODE equ 0
|
||||
|
||||
NEW_LINE db 0xa
|
||||
WRONG_ARGC db "Must be two command line argument", 0xa
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
;; rcx - argc
|
||||
pop rcx
|
||||
|
||||
;;
|
||||
;; Check argc
|
||||
;;
|
||||
cmp rcx, 3
|
||||
jne argcError
|
||||
|
||||
;;
|
||||
;; start to sum arguments
|
||||
;;
|
||||
|
||||
;; skip argv[0] - program name
|
||||
add rsp, 8
|
||||
|
||||
;; get argv[1]
|
||||
pop rsi
|
||||
;; convert argv[1] str to int
|
||||
call str_to_int
|
||||
;; put first num to r10
|
||||
mov r10, rax
|
||||
;; get argv[2]
|
||||
pop rsi
|
||||
;; convert argv[2] str to int
|
||||
call str_to_int
|
||||
;; put second num to r11
|
||||
mov r11, rax
|
||||
;; sum it
|
||||
add r10, r11
|
||||
|
||||
;;
|
||||
;; Convert to string
|
||||
;;
|
||||
mov rax, r10
|
||||
;; number counter
|
||||
xor r12, r12
|
||||
;; convert to string
|
||||
jmp int_to_str
|
||||
|
||||
;;
|
||||
;; Print argc error
|
||||
;;
|
||||
argcError:
|
||||
;; sys_write syscall
|
||||
mov rax, 1
|
||||
;; file descritor, standard output
|
||||
mov rdi, 1
|
||||
;; message address
|
||||
mov rsi, WRONG_ARGC
|
||||
;; length of message
|
||||
mov rdx, 34
|
||||
;; call write syscall
|
||||
syscall
|
||||
;; exit from program
|
||||
jmp exit
|
||||
|
||||
|
||||
;;
|
||||
;; Convert int to string
|
||||
;;
|
||||
int_to_str:
|
||||
;; reminder from division
|
||||
mov rdx, 0
|
||||
;; base
|
||||
mov rbx, 10
|
||||
;; rax = rax / 10
|
||||
div rbx
|
||||
;; add \0
|
||||
add rdx, 48
|
||||
;; push reminder to stack
|
||||
push rdx
|
||||
;; go next
|
||||
inc r12
|
||||
;; check factor with 0
|
||||
cmp rax, 0x0
|
||||
;; loop again
|
||||
jne int_to_str
|
||||
;; print result
|
||||
jmp print
|
||||
|
||||
;;
|
||||
;; Convert string to int
|
||||
;;
|
||||
str_to_int:
|
||||
;; accumulator
|
||||
xor rax, rax
|
||||
;; base for multiplication
|
||||
mov rcx, 10
|
||||
next:
|
||||
;; check that it is end of string
|
||||
cmp [rsi], byte 0
|
||||
;; return int
|
||||
je return_str
|
||||
;; mov current char to bl
|
||||
mov bl, [rsi]
|
||||
;; get number
|
||||
sub bl, 48
|
||||
;; rax = rax * 10
|
||||
mul rcx
|
||||
;; ax = ax + digit
|
||||
add rax, rbx
|
||||
;; get next number
|
||||
inc rsi
|
||||
;; again
|
||||
jmp next
|
||||
|
||||
return_str:
|
||||
ret
|
||||
|
||||
|
||||
;;
|
||||
;; Print number
|
||||
;;
|
||||
print:
|
||||
;;;; calculate number length
|
||||
mov rax, 1
|
||||
mul r12
|
||||
mov r12, 8
|
||||
mul r12
|
||||
mov rdx, rax
|
||||
;;;;
|
||||
|
||||
;;;; print sum
|
||||
mov rax, SYS_WRITE
|
||||
mov rdi, STD_IN
|
||||
mov rsi, rsp
|
||||
;; call sys_write
|
||||
syscall
|
||||
;;
|
||||
|
||||
;; newline
|
||||
jmp printNewline
|
||||
|
||||
;;
|
||||
;; Print number
|
||||
;;
|
||||
printNewline:
|
||||
mov rax, SYS_WRITE
|
||||
mov rdi, STD_IN
|
||||
mov rsi, NEW_LINE
|
||||
mov rdx, 1
|
||||
syscall
|
||||
jmp exit
|
||||
|
||||
;;
|
||||
;; Exit from program
|
||||
;;
|
||||
exit:
|
||||
;; syscall number
|
||||
mov rax, SYS_EXIT
|
||||
;; exit code
|
||||
mov rdi, EXIT_CODE
|
||||
;; call sys_exit
|
||||
syscall
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
|
||||
|
||||
section .data
|
||||
text db "Hello, World!", 10
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
mov rax, 1
|
||||
mov rdi, 1
|
||||
mov rsi, text
|
||||
mov rdx, 14
|
||||
syscall
|
||||
|
||||
mov rax, 60
|
||||
mov rdi, 0
|
||||
syscall
|
||||
|
||||
|
||||
BIN
x86_64/strings/reverse
Executable file
BIN
x86_64/strings/reverse
Executable file
Binary file not shown.
123
x86_64/strings/reverse.asm
Normal file
123
x86_64/strings/reverse.asm
Normal file
@@ -0,0 +1,123 @@
|
||||
;;
|
||||
;; initialized data
|
||||
;;
|
||||
section .data
|
||||
SYS_WRITE equ 1
|
||||
STD_OUT equ 1
|
||||
SYS_EXIT equ 60
|
||||
EXIT_CODE equ 0
|
||||
|
||||
NEW_LINE db 0xa
|
||||
INPUT db "Hello world!"
|
||||
|
||||
;;
|
||||
;; non initialized data
|
||||
;;
|
||||
section .bss
|
||||
OUTPUT resb 1
|
||||
|
||||
;;
|
||||
;; code
|
||||
;;
|
||||
section .text
|
||||
global _start
|
||||
|
||||
;;
|
||||
;; main routine
|
||||
;;
|
||||
_start:
|
||||
;; get addres of INPUT
|
||||
mov rsi, INPUT
|
||||
;; zeroize rcx for counter
|
||||
xor rcx, rcx
|
||||
; df = 0 si++
|
||||
cld
|
||||
; remember place after function call
|
||||
mov rdi, $ + 15
|
||||
;; get string lengt
|
||||
call calculateStrLength
|
||||
;; write zeros to rax
|
||||
xor rax, rax
|
||||
;; additional counter for reverseStr
|
||||
xor rdi, rdi
|
||||
;; reverse string
|
||||
jmp reverseStr
|
||||
|
||||
;;
|
||||
;; calculate length of string
|
||||
;;
|
||||
calculateStrLength:
|
||||
;; check is it end of string
|
||||
cmp byte [rsi], 0
|
||||
;; if yes exit from function
|
||||
je exitFromRoutine
|
||||
;; load byte from rsi to al and inc rsi
|
||||
lodsb
|
||||
;; push symbol to stack
|
||||
push rax
|
||||
;; increase counter
|
||||
inc rcx
|
||||
;; loop again
|
||||
jmp calculateStrLength
|
||||
|
||||
;;
|
||||
;; back to _start
|
||||
;;
|
||||
exitFromRoutine:
|
||||
;; push return addres to stack again
|
||||
push rdi
|
||||
;; return to _start
|
||||
ret
|
||||
|
||||
;;
|
||||
;; reverse string
|
||||
;;
|
||||
;; 31 in stack
|
||||
reverseStr:
|
||||
;; check is it end of string
|
||||
cmp rcx, 0
|
||||
;; if yes print result string
|
||||
je printResult
|
||||
;; get symbol from stack
|
||||
pop rax
|
||||
;; write it to output buffer
|
||||
mov [OUTPUT + rdi], rax
|
||||
;; decrease length counter
|
||||
dec rcx
|
||||
;; increase additional length counter (for write syscall)
|
||||
inc rdi
|
||||
;; loop again
|
||||
jmp reverseStr
|
||||
|
||||
;;
|
||||
;; Print result string
|
||||
;;
|
||||
printResult:
|
||||
mov rdx, rdi
|
||||
mov rax, 1
|
||||
mov rdi, 1
|
||||
mov rsi, OUTPUT
|
||||
syscall
|
||||
jmp printNewLine
|
||||
|
||||
;;
|
||||
;; Print new line
|
||||
;;
|
||||
printNewLine:
|
||||
mov rax, SYS_WRITE
|
||||
mov rdi, STD_OUT
|
||||
mov rsi, NEW_LINE
|
||||
mov rdx, 1
|
||||
syscall
|
||||
jmp exit
|
||||
|
||||
;;
|
||||
;; Exit from program
|
||||
;;
|
||||
exit:
|
||||
;; syscall number
|
||||
mov rax, SYS_EXIT
|
||||
;; exit code
|
||||
mov rdi, EXIT_CODE
|
||||
;; call sys_exit
|
||||
syscall
|
||||
BIN
x86_64/strings/reverse.o
Normal file
BIN
x86_64/strings/reverse.o
Normal file
Binary file not shown.
BIN
x86_64/sum/sum
Executable file
BIN
x86_64/sum/sum
Executable file
Binary file not shown.
47
x86_64/sum/sum.asm
Normal file
47
x86_64/sum/sum.asm
Normal file
@@ -0,0 +1,47 @@
|
||||
;initialised data section
|
||||
section .data
|
||||
; Define constants
|
||||
num1: equ 100
|
||||
num2: equ 50
|
||||
; http://geekswithblogs.net/MarkPearl/archive/2011/04/13/more-nasm.aspx
|
||||
msg: db "Sum is correct", 10
|
||||
|
||||
;;
|
||||
;; program code
|
||||
;;
|
||||
section .text
|
||||
global _start
|
||||
|
||||
;; entry point
|
||||
_start:
|
||||
; get sum of num1 and num2
|
||||
mov rax, num1
|
||||
mov rbx, num2
|
||||
add rax, rbx
|
||||
; compare rax with correct sum - 150
|
||||
cmp rax, 150
|
||||
; if rax is not 150 go to exit
|
||||
jne .exit
|
||||
; if rax is 150 print msg
|
||||
jmp .rightSum
|
||||
|
||||
; Print message that sum is correct
|
||||
.rightSum:
|
||||
;; write syscall
|
||||
mov rax, 1
|
||||
;; file descritor, standard output
|
||||
mov rdi, 1
|
||||
;; message address
|
||||
mov rsi, msg
|
||||
;; length of message
|
||||
mov rdx, 15
|
||||
;; call write syscall
|
||||
syscall
|
||||
; exit from program
|
||||
jmp .exit
|
||||
|
||||
; exit procedure
|
||||
.exit:
|
||||
mov rax, 60
|
||||
mov rdi, 0
|
||||
syscall
|
||||
BIN
x86_64/sum/sum.o
Normal file
BIN
x86_64/sum/sum.o
Normal file
Binary file not shown.
Reference in New Issue
Block a user