Advertisement
RicardasSim

c printf from asm

Sep 4th, 2019
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;trying to print from nasm asm with c printf, Ubuntu 18.04 64bit
  2. ;examples: https://www.csee.umbc.edu/portal/help/nasm/sample_64.shtml
  3. ;64 bit
  4. ;nasm -f elf64 main.asm -o main.o
  5. ;gcc -no-pie -m64 -o asm64_printf main.o
  6. ;./asm64_printf
  7.  
  8. extern printf
  9. extern strlen
  10.  
  11. SECTION .bss
  12.        
  13.     floatTmp: resq 1   
  14.  
  15. section .data
  16.  
  17.     ;null terminated string
  18.     msg_1: db "Hello !", 0
  19.     format_1: db "%s", 10, 0
  20.  
  21.     ;null terminated string
  22.     msg_2: db "Hello again !", 0
  23.     msgLen_2 equ $-msg_2
  24.     format_2: db "%s length (with null terminator): %d", 10, 0
  25.  
  26.     ;string strlen
  27.     format_3: db "%s string lenght: %zu", 10, 0
  28.  
  29.     ;char
  30.     char_1 db 'c'
  31.     format_4: db "%c", 10, 0
  32.     format_5: db "%c %c %c", 10, 0
  33.  
  34.     ;integer
  35.     int_1 dd 1234567890
  36.     format_6: db "integer: %d", 10, 0
  37.  
  38.     ;long integer
  39.     lInt_1 dq 1234567890123456789
  40.     format_7: db "long integer: %ld", 10, 0
  41.  
  42.     ;hex
  43.     hex_1: dd 0x12345
  44.     format_8: db "hex: %X", 10, 0
  45.     format_9: db "hex: %08X", 10, 0
  46.  
  47.     ;long hex
  48.     hexL_1: dq 0x123456789
  49.     format_10: db "hex (long): %lX", 10, 0
  50.     format_11: db "hex (long): %016lX", 10, 0
  51.  
  52.     ;float
  53.     float_1: dd 12.345
  54.     format_12: db "float: %f", 10, 0
  55.  
  56.     ;double
  57.     double_1: dq 12345.1234567
  58.     format_13: db "double: %f", 10, 0
  59.  
  60.     format_14: db "float: %f double: %f", 10, 0
  61.     format_15: db "char: %c float: %f double: %f", 10, 0
  62.     format_16: db "char: %c integer: %d float: %f double: %f", 10, 0
  63.  
  64.     ;TODO long double
  65.     ldouble_1: dt 1234567.1234567
  66.     format_17: db "long double: %Lf", 10, 0
  67.     format_18: db "long double: %.7Lf", 10, 0
  68.  
  69. section .text
  70. global main
  71.  
  72. main:
  73.  
  74.     push    rbp
  75.  
  76.     ;string
  77.     mov rdi,format_1
  78.     mov rsi,msg_1
  79.     xor rax,rax ;mov rax,0
  80.     call printf
  81.  
  82.     ;string, length
  83.     mov rdi,format_2
  84.     mov rsi,msg_2
  85.     mov rdx,msgLen_2
  86.     xor rax,rax ;mov rax,0
  87.     call printf
  88.  
  89.     ;string strlen
  90.     mov rdi,msg_2
  91.     call strlen
  92.  
  93.     mov rdi,format_3
  94.     mov rsi,msg_2
  95.     mov rdx,rax ;strlen result
  96.     xor rax,rax ;mov rax,0
  97.     call printf
  98.  
  99.     ;char
  100.     mov rdi,format_4
  101.     mov rsi,[char_1]
  102.     xor rax,rax ;mov rax,0
  103.     call printf
  104.  
  105.     ;char char char
  106.     mov rdi,format_5
  107.     mov rsi,[char_1]
  108.     mov rdx,[char_1]
  109.     mov rcx,[char_1]
  110.     xor rax,rax ;mov rax,0
  111.     call printf
  112.  
  113.     ;integer
  114.     mov rdi,format_6
  115.     mov rsi,[int_1]
  116.     xor rax,rax ;mov rax,0
  117.     call printf
  118.  
  119.     ;long integer
  120.     mov rdi,format_7
  121.     mov rsi,[lInt_1]
  122.     xor rax,rax ;mov rax,0
  123.     call printf
  124.  
  125.     ;hex
  126.     mov rdi,format_8
  127.     mov rsi,[hex_1]
  128.     xor rax,rax ;mov rax,0
  129.     call printf
  130.  
  131.     mov rdi,format_9
  132.     mov rsi,[hex_1]
  133.     xor rax,rax ;mov rax,0
  134.     call printf
  135.  
  136.     ;long hex
  137.     mov rdi,format_10
  138.     mov rsi,[hexL_1]
  139.     xor rax,rax ;mov rax,0
  140.     call printf
  141.  
  142.     mov rdi,format_11
  143.     mov rsi,[hexL_1]
  144.     xor rax,rax ;mov rax,0
  145.     call printf    
  146.  
  147.     ;float
  148.     fld dword [float_1]
  149.     fstp qword [floatTmp]
  150.  
  151.     mov rdi,format_12
  152.     movq xmm0, qword [floatTmp]
  153.     mov rax, 1
  154.     call printf
  155.  
  156.     ;double
  157.     mov rdi,format_13
  158.     movq xmm0, qword [double_1]
  159.     mov rax, 1
  160.     call printf
  161.  
  162.     ;float and double
  163.     mov rdi,format_14
  164.     movq xmm0, qword [floatTmp]
  165.     movq xmm1, qword [double_1]
  166.     mov rax, 2
  167.     call printf    
  168.  
  169.     ;char, float, double
  170.     mov rdi,format_15
  171.     mov rsi,[char_1]
  172.     movq xmm0, qword [floatTmp]
  173.     movq xmm1, qword [double_1]
  174.     mov rax, 2
  175.     call printf
  176.  
  177.     ;char, int, float, double
  178.     mov rdi,format_16
  179.     mov rsi,[char_1]
  180.     mov rdx,[int_1]
  181.     movq xmm0, qword [floatTmp]
  182.     movq xmm1, qword [double_1]
  183.     mov rax, 2
  184.     call printf
  185.  
  186.     ;TODO long double    
  187.     mov rbp, rsp
  188.     sub rsp, 16
  189.     mov rdi,format_17
  190.     fld tword [ldouble_1]
  191.     fstp tword [rbp-10h]
  192.     push qword [rbp-8h]
  193.     push qword [rbp-10h]
  194.     xor rax,rax ;mov rax,0
  195.     call printf
  196.     ;add rsp, 16
  197.     mov rsp,rbp
  198.  
  199.     ;mov rbp, rsp
  200.     sub rsp, 16
  201.     mov rdi,format_18
  202.     fld tword [ldouble_1]
  203.     fstp tword [rbp-10h]
  204.     push qword [rbp-8h]
  205.     push qword [rbp-10h]
  206.     xor rax,rax ;mov rax,0
  207.     call printf
  208.     ;add rsp, 16
  209.     mov rsp,rbp
  210.  
  211.     pop rbp
  212.  
  213.     xor rax,rax ;mov rax,0
  214.     ret
  215.  
  216. ;output:
  217. ;
  218. ;Hello !
  219. ;Hello again ! length (with null terminator): 14
  220. ;Hello again ! string lenght: 13
  221. ;c
  222. ;c c c
  223. ;integer: 1234567890
  224. ;long integer: 1234567890123456789
  225. ;hex: 12345
  226. ;hex: 00012345
  227. ;hex (long): 123456789
  228. ;hex (long): 0000000123456789
  229. ;float: 12.345000
  230. ;double: 12345.123457
  231. ;float: 12.345000 double: 12345.123457
  232. ;char: c float: 12.345000 double: 12345.123457
  233. ;char: c integer: 1234567890 float: 12.345000 double: 12345.123457
  234. ;long double: 1234567.123457
  235. ;long double: 1234567.1234567
  236. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement