Advertisement
drankinatty

Nasm x86_64 Use Stack For Temp Storage

May 5th, 2022
1,507
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; strn (string const) macro is overloaded to take 1 or 2 args
  2. ; the address and optionally the number of chars to output
  3. ; (default 1)
  4. %macro  strn  1
  5.   mov     rax, 1
  6.   mov     rdi, 1
  7.   mov     rsi, %1
  8.   mov     rdx, 1
  9.   syscall
  10. %endmacro
  11.  
  12. %macro  strn  2
  13.   mov     rax, 1
  14.   mov     rdi, 1
  15.   mov     rsi, %1
  16.   mov     rdx, %2
  17.   syscall
  18. %endmacro
  19.  
  20. section .data
  21.  
  22.   nwln db 0xa                             ; newline
  23.   abet db "abcdefghijklmnopqrstuvwxyz"    ; alphabet
  24.   ablen equ $ - abet                      ; alphabet len
  25.  
  26. section .bss
  27.  
  28. section .text
  29.       global _start
  30.  
  31.   _start:
  32.  
  33.       sub     rsp, 32             ; grow stack by 32-bytes
  34.      
  35.       xor     rcx, rcx            ; zero rcx
  36.       mov     cl, ablen           ; set count register to ablen
  37.      
  38.       mov     rsi, abet           ; address of source in rsi
  39.       mov     rdi, rsp            ; address of dest in rdi
  40.       rep     movsb               ; copy string to stack at rsp
  41.      
  42.       strn    abet, ablen         ; output string from abet
  43.       strn    nwln                ; output newline
  44.      
  45.       strn    rsp, ablen          ; output string from copy
  46.       strn    nwln                ; output newline
  47.      
  48.       lea     rsi, [abet + 14]    ; address of 15th, 'o' from abet
  49.       strn    rsi                 ; output char
  50.       strn    nwln                ; output newline
  51.      
  52.       lea     rsi, [rsp + 14]     ; address of 15th, 'o' from copy
  53.       strn    rsi                 ; output char
  54.       strn    nwln                ; output newline
  55.      
  56.       lea     rsi, [rsp + ablen - 1]  ; load addr of 'z' in rsi
  57.      
  58.   prnchar:                        ; print from copy in reverse
  59.       strn    rsi                 ; print char at rsi
  60.       dec     rsi                 ; decrement address
  61.       cmp     rsi, rsp            ; compare to rsp
  62.       jge prnchar                 ; loop through rsi == rsp
  63.       strn    nwln                ; output newline
  64.      
  65.       mov     rsi, rsp            ; load copy to rsi
  66.      
  67.   eachchar:                       ; print every other char
  68.       strn    rsi                 ; print char at rsi
  69.       inc     rsi                 ; increment address at rsi
  70.       mov     al, 0               ; load 0 in al
  71.       cmp     al, byte[rsi]       ; compare byte
  72.       je      exit                ; if end, jump to exit
  73.       inc     rsi                 ; skip to next char
  74.       cmp     al, byte[rsi]       ; compare byte
  75.       jne     eachchar            ; repeat until nul-char reached
  76.      
  77.   exit:
  78.       strn    nwln                ; output newline
  79.      
  80.       add     rsp, 32             ; restore stack pointer address
  81.      
  82.       xor     rdi, rdi            ; set zero exit code
  83.       mov     rax, 60             ; set syscall number to 60 (0x3c hex)
  84.       syscall                     ; call kernel
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement