Ladies_Man

#ccc God u have mercy thx

Jan 5th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #==========================================
  2. #------------------data--------------------
  3. #==========================================
  4. .section .data
  5.  
  6. RTLWriteIntegerBuffer:
  7.     .byte 0x3c,0x3d,0x3e,0x00       #    <=>\0
  8.     .byte 0x3c,0x3d,0x3e,0x00       #    <=>\0
  9.     .byte 0x3c,0x3d,0x3e,0x00       #    <=>\0
  10.          
  11. ReadCharBuffer:
  12.     .byte 0x3d
  13.                  
  14. ReadCharInited:
  15.     .byte 0x6e
  16.            
  17. IsEOF:
  18.     .byte 0x61
  19.    
  20. #==========================================
  21. #-------------------bss--------------------
  22. #==========================================    
  23. .section .bss
  24.    
  25.     .macro pushall
  26.         pushq %rdi
  27.         pushq %rsi
  28.         pushq %rbp
  29.         pushq %rsp
  30.         pushq %rdx
  31.         pushq %rcx
  32.         pushq %rbx
  33.         pushq %rax
  34.        
  35.     .endm
  36.    
  37.     .macro popall
  38.         popq %rax
  39.         popq %rbx
  40.         popq %rcx
  41.         popq %rdx
  42.         popq %rsp
  43.         popq %rbp
  44.         popq %rsi
  45.         popq %rdi
  46.     .endm
  47.    
  48.     .macro parleft
  49.         pushq $'{'
  50.         call RTLWriteChar   #write 'A'
  51.         addq $8,    %rsp
  52.     .endm
  53.    
  54.     .macro parright
  55.         pushq $'}'
  56.         call RTLWriteChar   #write 'A'
  57.         addq $8,    %rsp
  58.     .endm
  59.    
  60. #==========================================
  61. #------------------text--------------------
  62. #==========================================
  63. .section .text
  64.  
  65. .globl _start
  66. _start:
  67.     jmp StubEntryPoint
  68.  
  69. /*
  70. 1.    RTLHalt — остановка программы,
  71. 2. X  RTLWriteChar — запись char’а на stdout,
  72. 3. X  RTLWriteInteger — запись целого на stdout, принимает два параметра: число и ширину вывода,
  73. 4. X  RTLWriteLn — выводит на stdout символ новой строки (13, 10),
  74. 5. X  RTLReadChar — считывает символ из stdin, результат кладёт в EAX,
  75. 6.    RTLReadInteger — считывает целое из stdin, результат кладёт в EAX,
  76. 7. X  RTLReadLn — пропускает стандартный ввод до конца файла или ближайшего перевода строки,
  77. 8. X  RTLEOF — возвращает в EAX число 1, если достигнут конец файла (следующий символ прочитать невозможно) или 0 в противном случае,
  78. 9. X  RTLEOLN — возвращает в EAX число 1, если следующий символ \n, 0 — в противном случае.
  79.  
  80. 10.   MMAP
  81. 11.   MUNMAP
  82. **/
  83. #------------------------------------------
  84. #----------------WriteChar-----------------
  85. #------------------------------------------
  86. RTLWriteChar:
  87.     pushall
  88.     movq %rsp,   %rbp    #better use base ptr to stack frame
  89.                         #instead of stack itself
  90.     movq $1,    %rax    #syscall №
  91.     movq $1,    %rdi    #param1, fd
  92.     movq %rbp,  %rsi    #p2, buf
  93.     addq $72,   %rsi    #stack:[0-ret,8-arg1,16-arg2]
  94.     movq $1,    %rdx    #p3, count
  95.  
  96.     syscall
  97.    
  98.     popall
  99.     ret
  100.    
  101. #------------------------------------------
  102. #--------------WriteInteger----------------
  103. #------------------------------------------    
  104. RTLWriteInteger:
  105.     pushq %rbp
  106.     movq %rsp,  %rbp
  107.    
  108.     movq 16(%rbp),  %rbx    #arg: count (stdout width)
  109.     movq 24(%rbp),  %rax    #arg: num
  110.    
  111.     cmpq $0,    %rax
  112.     jnl RTLWriteIntegerNotSigned
  113.        
  114.         negq %rax
  115.         decq %rbx
  116.         pushq $'-'              #dont forget to pop
  117.         call RTLWriteChar
  118.         addq $8, %rsp           #pop
  119.    
  120.     RTLWriteIntegerNotSigned:
  121.     xorq %rcx,  %rcx
  122.     pushq %rax
  123.     pushq %rbx
  124.    
  125.     RTLWriteIntegerPreCheckLoop:
  126.         testq %rax, %rax
  127.         jz RTLWriteIntegerPreCheckLoopDone
  128.         incq %rcx
  129.         movq $10,   %rbx
  130.         xorq %rdx,  %rdx
  131.         idiv %rbx          
  132.        
  133.         jmp RTLWriteIntegerPreCheckLoop
  134.        
  135.     RTLWriteIntegerPreCheckLoopDone:
  136.     testq %rcx, %rcx
  137.     setz %dl                        #dl: 0 == rcx ? 1 : 0
  138.     orb %dl,    %cl
  139.    
  140.     popq %rbx
  141.     popq %rax
  142.     subq %rcx,  %rbx
  143.    
  144.     cmpq $0,    %rbx
  145.     jle RTLWriteIntegerNotPadding
  146.         pushq %rcx
  147.    
  148.         RTLWriteIntegerPaddingLoop:
  149.             pushq $' '              #pop!
  150.             call RTLWriteChar
  151.             addq $8,    %rsp        #pop
  152.             decq %rbx
  153.         jnz RTLWriteIntegerPaddingLoop
  154.         popq %rcx
  155.    
  156.     RTLWriteIntegerNotPadding:
  157.     #find last digit's address:    
  158.    #we write from right to left cuz each time we divide number by 10, we only know it's right-most digit
  159.     #so we need to write right-most digit into right-most byte:
  160.    
  161.     #e.g: num=-123; count=4
  162.     #init buffer:   |0x3b|0x3d|0x3e|0x00|0x3b|...
  163.     #1st iter:      |0x3b|0x3d| 3d |0x00|0x3b|...
  164.     #2st iter:      |0x3b| 2d | 3d |0x00|0x3b|...
  165.     #3st iter:      | 1d | 2d | 3d |0x00|0x3b|...
  166.    
  167.     movq $RTLWriteIntegerBuffer, %rdi   #leaq RTLWriteIntegerBuffer-1(%rcx), %rdi
  168.     addq %rcx,  %rdi                    #-||-
  169.     decq %rdi                           #-||-
  170.     #LEA EDI,[OFFSET RTLWriteIntegerBuffer+ECX-1]
  171.    
  172.     pushq %rcx              #we dont care if (count < real_num_width)
  173.  
  174.     RTLWriteIntegerLoop:
  175.         movq $10,   %rsi
  176.         xorq %rdx,  %rdx
  177.         idiv %rsi
  178.         #convert to string
  179.         movq %rdx,  %rbx    #leaq '0'(%rdx), %rbx equivalent
  180.         addq $'0',  %rbx    #-||-
  181.        
  182.         movb %bl, (%rdi)
  183.         decq %rdi
  184.     loop RTLWriteIntegerLoop
  185.    
  186.     popq %rcx
  187.    
  188.     #invoke WriteFile
  189.     movq $1,    %rax                    #syscall
  190.     movq $1,    %rdi                    #param1, fd
  191.     movq $RTLWriteIntegerBuffer,  %rsi  #p2, buf
  192.     movq %rcx,    %rdx                  #p3, count
  193.  
  194.     syscall
  195.    
  196.     popq %rbp
  197.     ret
  198.    
  199. #------------------------------------------
  200. #-----------------WriteLn------------------
  201. #------------------------------------------    
  202. RTLWriteLn:
  203.     pushq $13
  204.     call RTLWriteChar
  205.     addq $8,    %rsp
  206.    
  207.     pushq $10
  208.     call RTLWriteChar
  209.     addq $8,    %rsp
  210.  
  211.     ret
  212.    
  213.      
  214. ReadCharEx:
  215.     pushall
  216.     movq %rsp,  %rbp
  217.    
  218.     movq %rax, %rbx         #copy rax to rbx cuz of rax's usage in syscall
  219.    
  220.    movq $0,    %rax            #syscall read
  221.    movq $0,    %rdi            #p1:stdin
  222.    movq $ReadCharBuffer,  %rsi #p2:buffer
  223.    movq $1,    %rdx            #p3:count
  224.    syscall
  225.  
  226.    #off
  227.    xorq %rcx, %rcx
  228.    movb (IsEOF), %cl
  229.    movzx %cl, %rcx
  230.    pushq %rcx
  231.    call RTLWriteChar  
  232.    addq $8,    %rsp
  233.  
  234.    testq %rbx, %rbx    
  235.    setz %bl                    #al: 0 == rax ? 1 : 0
  236.    orb %bl,    IsEOF
  237.    
  238.    #off
  239.    movb (IsEOF), %cl
  240.    movzx %cl, %rcx
  241.    pushq %rcx
  242.    call RTLWriteChar  
  243.    addq $8,    %rsp
  244.    
  245.    popall
  246.    ret
  247.    
  248. ReadCharInit:
  249.    #off:
  250.    parleft
  251.    
  252.    pushq %rcx
  253.    movb (ReadCharInited), %cl
  254.    movzx %cl, %rcx
  255.    pushq %rcx
  256.    call RTLWriteChar   #write 'A'
  257.    addq $8,    %rsp
  258.    
  259.    parright
  260.    
  261.    
  262.    cmpb $'n',    (ReadCharInited)
  263.    jnz ReadInitDone
  264.    
  265.        call ReadCharEx
  266.        movb $'y',    (ReadCharInited)
  267.  
  268.    ReadInitDone:
  269.  
  270.    #off:
  271.    parleft
  272.    
  273.    movb (ReadCharInited), %cl
  274.    movzx %cl, %rcx
  275.    pushq %rcx
  276.    call RTLWriteChar   #write 'A'
  277.    addq $8,    %rsp
  278.    
  279.    popq %rcx
  280.    
  281.    parright
  282.    
  283.    ret
  284.  
  285. #------------------------------------------
  286. #----------------ReadChar------------------
  287. #------------------------------------------    
  288. RTLReadChar:
  289.    call ReadCharInit
  290.  
  291.    xorq %rax, %rax
  292.    movb ReadCharBuffer,   %al    #movzx (ReadCharBuffer), %rax
  293.    movzx %al, %rax
  294.    
  295.    call ReadCharEx        
  296.              
  297.    pushq %rax
  298.    call RTLWriteChar   #write from rax to stdout
  299.    addq $8,    %rsp
  300.  
  301.    ret
  302.  
  303. #------------------------------------------
  304. #--------------ReadInteger-----------------
  305. #------------------------------------------    
  306. RTLReadInteger:
  307.    call ReadCharInit
  308.    
  309.    pushq (ReadCharBuffer)
  310.    call RTLWriteChar   #write 'A'
  311.    addq $8,    %rsp
  312.    
  313.    pushall
  314.    movq %rsp,  %rbp
  315.    
  316.    movq $1, %rcx    #leaq 1(%rax,%rbx=0,1), %rcx  equivalent
  317.    
  318.    ReadIntegerSkipWhiteSpace:
  319.        cmpb $'a',    IsEOF
  320.        jnz ReadIntegerDone
  321.        cmpb $0,    ReadCharBuffer
  322.        je ReadIntegerSkipWhiteSpaceDone
  323.        cmpb $32,   ReadCharBuffer
  324.        ja ReadIntegerSkipWhiteSpaceDone
  325.        
  326.        call ReadCharEx
  327.        
  328.        jmp ReadIntegerSkipWhiteSpace
  329.        
  330.    ReadIntegerSkipWhiteSpaceDone:
  331.    cmpb $'-',  (ReadCharBuffer)
  332.    jne ReadIntegerNotSigned
  333.        
  334.        negq %rcx
  335.        call ReadCharEx
  336.        
  337.    ReadIntegerNotSigned:
  338.    ReadIntegerLoop:
  339.        xorq %rbx, %rbx
  340.        movb ReadCharBuffer,  %bl
  341.        #xorq %rax, %rax
  342.        #movzx %bl,  %rax
  343.        
  344.        cmpb $'0',  %bl
  345.        jb ReadIntegerDone
  346.        cmpb $'9',  %bl
  347.        ja ReadIntegerDone
  348.        
  349.        imul $10,   %rax            #rax *= 10
  350.        #cast string to int:
  351.        subq $'0',  %rbx            #lea -'0'(%rax,%rbx,1),  %rax
  352.        addq %rbx,  %rax            #-||-
  353.        
  354.        call ReadCharEx
  355.        jmp ReadIntegerLoop
  356.    
  357.    ReadIntegerDone:
  358.    imul %rcx               #rax *= rcx  (rcx={1;-1})
  359.    
  360.    pushq %rax
  361.    pushq $0
  362.    call RTLWriteInteger   #write rax
  363.    addq $16,    %rsp
  364.    
  365.    #proverka chto tam real'no $43 lezhit pri stdin=" 43e"
  366.     cmpq $43, %rax
  367.     jne nope
  368.     pushq $'G'
  369.     call RTLWriteChar   #write 'X'
  370.     addq $8,    %rsp
  371.     jmp skip
  372.     nope:
  373.     pushq $'B'
  374.     call RTLWriteChar   #write 'X'
  375.     addq $8,    %rsp
  376.    
  377.     skip:
  378.     pushq $'X'
  379.     call RTLWriteChar   #write 'X'
  380.     addq $8,    %rsp
  381.    
  382.     popall
  383.     ret
  384.  
  385. #------------------------------------------
  386. #------------------ReadLn------------------
  387. #------------------------------------------        
  388. RTLReadLn:
  389.     call ReadCharInit
  390.    
  391.     cmpb $0,    IsEOF                   #compare to null
  392.     jne ReadLnDone
  393.    
  394.         movb ReadCharBuffer,    %bl    
  395.         cmpb $10,   %bl                 #compare to lineFeed
  396.         je ReadLnDone
  397.    
  398.     call ReadCharEx
  399.     jmp RTLReadLn
  400.    
  401.     ReadLnDone:
  402.     ret
  403.  
  404. #------------------------------------------
  405. #-------------------EOF--------------------
  406. #------------------------------------------        
  407. RTLEOF:
  408.     xorq %rax,  %rax
  409.     movb IsEOF, %al
  410.     movzx %al,  %rax
  411.     ret
  412.  
  413. #------------------------------------------
  414. #------------------EOLN--------------------
  415. #------------------------------------------    
  416. RTLEOLN:
  417.     cmpb $10,   ReadCharBuffer
  418.     sete %bl
  419.     ret
  420.  
  421. #------------------------------------------
  422. #------------------Halt--------------------
  423. #------------------------------------------        
  424. RTLHalt:
  425.     movq $60,   %rax
  426.     movq $0,    %rdi
  427.     syscall
  428.  
  429.  
  430. #//==----------------------------------==//
  431. #//----------------ENTRY-----------------//
  432. #//==----------------------------------==//
  433. StubEntryPoint:
  434.     #syscall mmap here
  435.  
  436.     /*pushq $-123
  437.     pushq $5
  438.     call RTLWriteInteger  
  439.     call RTLWriteLn
  440.    
  441.     pushq $'A'
  442.     call RTLWriteChar   #write 'A'
  443.     addq $8,    %rsp
  444.     call RTLWriteLn*/
  445.  
  446.     #call RTLReadChar    #read from stdin to rax
  447.     call RTLReadInteger
  448.  
  449.    
  450.    
  451.     #syscall munmap here
  452.     call RTLHalt
  453.    
  454.     /*
  455.     gdb:
  456.     info files
  457.     b *0x4000xx
  458.     run
  459.     si 1
  460.     ni 1
  461.     x/5i $pc
  462.     x/8g $sp
  463.     info registers
  464.     p $rax
  465.     set $rax = 0x123
  466.     */
Advertisement
Add Comment
Please, Sign In to add comment