Advertisement
STANAANDREY

asm double of nr

Nov 4th, 2024
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Program to read a number and print its double
  2. section .data
  3.     prompt db "Enter a number: ", 0
  4.     prompt_len equ $ - prompt
  5.     result db "Double of the number is: ", 0
  6.     result_len equ $ - result
  7.     newline db 10, 0
  8.  
  9. section .bss
  10.     num resb 32    ; Buffer to store input string
  11.     output resb 32 ; Buffer to store output string
  12.  
  13. section .text
  14.     global _start
  15.  
  16. _start:
  17.     ; Print prompt
  18.     mov rax, 1          ; sys_write
  19.     mov rdi, 1          ; stdout
  20.     mov rsi, prompt     ; message to write
  21.     mov rdx, prompt_len ; message length
  22.     syscall
  23.  
  24.     ; Read input
  25.     mov rax, 0          ; sys_read
  26.     mov rdi, 0          ; stdin
  27.     mov rsi, num        ; buffer
  28.     mov rdx, 32         ; buffer size
  29.     syscall
  30.  
  31.     ; Convert string to integer using atoi
  32.     mov rdi, num        ; number string to convert
  33.     call atoi           ; call our atoi function
  34.    
  35.     ; Double the number
  36.     add rax, rax        ; multiply by 2
  37.    
  38.     ; Convert integer back to string
  39.     mov rdi, output     ; output buffer
  40.     mov rsi, rax        ; number to convert
  41.     call itoa           ; call our itoa function
  42.  
  43.     ; Print result message
  44.     mov rax, 1          ; sys_write
  45.     mov rdi, 1          ; stdout
  46.     mov rsi, result     ; message
  47.     mov rdx, result_len ; length
  48.     syscall
  49.  
  50.     ; Print the doubled number
  51.     mov rax, 1          ; sys_write
  52.     mov rdi, 1          ; stdout
  53.     mov rsi, output     ; converted number string
  54.     mov rdx, 32         ; max length
  55.     syscall
  56.  
  57.     ; Print newline
  58.     mov rax, 1
  59.     mov rdi, 1
  60.     mov rsi, newline
  61.     mov rdx, 1
  62.     syscall
  63.  
  64.     ; Exit
  65.     mov rax, 60         ; sys_exit
  66.     mov rdi, 0          ; exit code 0
  67.     syscall
  68.  
  69. ; Function to convert ASCII string to integer (atoi)
  70. atoi:
  71.     xor rax, rax        ; zero out rax
  72.     xor rcx, rcx        ; zero out rcx
  73. .loop:
  74.     movzx rdx, byte [rdi + rcx] ; get current char
  75.     cmp dl, 0xa         ; check for newline
  76.     je .done
  77.     cmp dl, 0           ; check for null terminator
  78.     je .done
  79.    
  80.     sub dl, '0'         ; convert ASCII to number
  81.     imul rax, 10        ; multiply current result by 10
  82.     add rax, rdx        ; add new digit
  83.    
  84.     inc rcx             ; move to next char
  85.     jmp .loop
  86. .done:
  87.     ret
  88.  
  89. ; Function to convert integer to ASCII string (itoa)
  90. itoa:
  91.     push rbp
  92.     mov rbp, rsp
  93.     sub rsp, 32         ; allocate stack space
  94.    
  95.     mov rax, rsi        ; number to convert
  96.     mov rcx, 0          ; digit counter
  97.     mov r8, 10          ; divisor
  98.    
  99. .divide_loop:
  100.     xor rdx, rdx        ; clear remainder
  101.     div r8              ; divide by 10
  102.     add dl, '0'         ; convert to ASCII
  103.     push rdx            ; save digit
  104.     inc rcx             ; increment counter
  105.     test rax, rax       ; check if done
  106.     jnz .divide_loop
  107.    
  108. .build_string:
  109.     mov rdx, rcx        ; save length
  110. .digit_loop:
  111.     pop rax             ; get digit
  112.     mov [rdi], al       ; store in buffer
  113.     inc rdi             ; next position
  114.     loop .digit_loop
  115.    
  116.     mov byte [rdi], 0   ; null terminate
  117.    
  118.     mov rsp, rbp
  119.     pop rbp
  120.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement