Advertisement
Guest User

Untitled

a guest
Oct 11th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .globl _start
  2.  
  3. .text
  4. _start:
  5.     pop %rcx # count command line argumens
  6.     pop %rax # program name
  7.     mov $cnt, %rax
  8.     mov %rcx, (%rax)
  9. _parse_loop:
  10.     mov $0, %rcx
  11. _match_operation:
  12.     mov $op_description_table, %rsi
  13.  
  14.     mov (%rsi, %rcx, 8), %rax      # op_name
  15.     mov 8(%rsi, %rcx, 8), %rbx     # op_len
  16.  
  17.     pop %rsi            # start address of first buffer
  18.     push %rsi
  19.     push %rcx
  20.    
  21.  
  22.     mov %rax, %rdi      # start address of second buffer
  23.     mov %rbx, %rcx      # search len
  24.     cld
  25.     repe cmpsb
  26.  
  27.     pop %rcx
  28.  
  29.     jne _match_operation_end
  30.  
  31. __match_operation_handle_op:
  32.     pop %rsi # delete op name
  33.  
  34.     mov $op_description_table, %rsi
  35.     mov 16(%rsi, %rcx, 8), %rax     # op_handler
  36.     mov 24(%rsi, %rcx, 8), %rbx     # op_argument
  37.  
  38.     push %rbx
  39.     call *%rax
  40.     jmp _parse_loop_end
  41.  
  42. _match_operation_end:
  43.     mov $row, %rax
  44.     add (%rax), %rcx
  45.     mov $all_row, %rax
  46.     cmp (%rax), %rcx
  47.     je _parse_loop_end
  48.     jmp _match_operation
  49.  
  50. _parse_loop_end:
  51.     mov $cnt, %rax
  52.     mov (%rax), %rcx
  53.     dec %rcx
  54.     mov %rcx, (%rax)
  55.     loop _parse_loop
  56.  
  57.     mov $op_arguments_table, %rsi
  58.     push 8(%rsi)
  59.     push (%rsi)
  60.     mov $16, %rdi
  61.     call *(%rsi, %rdi)
  62.  
  63.     push %rax
  64.     call _int_to_str
  65.  
  66. __write_res:
  67.     push %rax
  68.     mov $1, %rax
  69.     mov %rax, %rdi
  70.     pop %rsi
  71.     mov $l_buf, %rdx
  72.     syscall
  73.  
  74.     jmp _exit
  75.  
  76. # functions save its result in 'rax'
  77. _add:
  78.     pop %rax
  79.  
  80.     pop %rbx # op1
  81.     pop %rdx # op2
  82.     add %rdx, %rbx
  83.  
  84.     push %rax # save address
  85.     mov %rbx, %rax
  86.     xor %rdx, %rdx
  87.     ret
  88. _sub:
  89.     pop %rax
  90.  
  91.     pop %rbx # op1
  92.     pop %rdx # op2
  93.     sub %rdx, %rbx
  94.  
  95.     push %rax
  96.     mov %rbx, %rax
  97.     xor %rdx, %rdx
  98.  
  99.     ret
  100. _mul:
  101.     pop %rcx
  102.  
  103.     pop %rax
  104.     pop %rbx
  105.     mul %rbx
  106.  
  107.     push %rcx
  108.  
  109.     ret
  110. _div:
  111.     pop %rbx
  112.  
  113.     xor %rdx, %rdx
  114.     pop %rax
  115.     pop %rcx
  116.     div %rcx
  117.  
  118.     xor %rdx, %rdx
  119.     push %rbx
  120.     ret
  121. _translate_operand:
  122.     pop %rax # ret address
  123.    
  124.     pop %rdx # where to save
  125.     pop %rbx # number for parsing
  126.  
  127.     push %rax
  128.     push %rdx
  129.     push %rbx
  130.     call _str_to_int
  131. __translate_operand_str:
  132.     push %rax
  133.     call _save_to
  134.     mov $cnt, %rax
  135.     mov (%rax), %rcx
  136.     dec %rcx
  137.     mov %rcx, (%rax)
  138.     ret
  139.  
  140. _save_opearation:
  141.     pop %rax
  142.  
  143.     mov $op_arguments_table, %rsi
  144.     add $16, %rsi
  145.     pop %rbx    # what save
  146.     push %rax   # ret address
  147.     push %rsi   # where save
  148.     push %rbx   # what save
  149.     call _save_to
  150.     ret
  151. _save_to:
  152.     pop %rax # ret address
  153.  
  154.     pop %rbx # what save
  155.     pop %rdx # where save
  156.  
  157.     mov %rbx, (%rdx)
  158.     push %rax
  159.     ret
  160. _str_to_int: # translate str to int
  161.     pop %rbx        # pop ret address
  162.     pop %rsi        # int string
  163.     push %rbx       # push ret address
  164.     mov $0, %rcx
  165.     mov $0, %rax
  166. # push neg condition to stack
  167.     mov $0, %rbx    
  168.     push %rbx
  169.     mov (%rsi), %rdx
  170.     cmp $'-', %dl
  171.     jne __str_to_int_parse_loop
  172.     pop %rbx
  173.     inc %rbx
  174.     push %rbx
  175.     inc %rsi
  176. __str_to_int_parse_loop:
  177.     mov (%rsi), %rdx
  178.     mov %dl, %bl
  179.  
  180.     inc %rsi
  181.     cmp $0, %rbx
  182.     je __str_to_int_fin
  183.  
  184.     sub $'0', %rbx
  185.     mov $10, %rcx
  186.     xor %rdx, %rdx
  187.     mul %rcx
  188.     add %rbx, %rax
  189.  
  190.     jmp __str_to_int_parse_loop
  191. __str_to_int_fin:
  192.     pop %rbx
  193.     cmp $0, %rbx
  194.     je __str_to_int_ret
  195.     neg %rax
  196.  __str_to_int_ret:
  197.     ret
  198. _int_to_str: # translate int to str
  199.     pop %rbx # ret address
  200.     mov $buf, %rdi
  201. __int_to_str_stack_process:
  202.     pop %rax
  203.     mov $0, %rcx
  204.     cmp $0, %rax
  205.     je __int_to_str_ret
  206.  
  207.     test %rax, %rax
  208.     jns __int_to_str_loop
  209.     push %rcx
  210.     mov $'-', %cl
  211.     mov %cl, (%rdi)
  212.     pop %rcx
  213.     inc %rdi
  214.     neg %rax
  215. __int_to_str_loop:
  216.     push %rcx
  217.     xor %rdx, %rdx
  218.     mov $10, %rcx
  219.     div %rcx
  220.     pop %rcx
  221.     inc %rcx
  222.    
  223.     add $'0', %rdx
  224.     push %rdx
  225.  
  226.     cmp $0, %rax
  227.     jne __int_to_str_loop
  228. __int_to_str_reverse:
  229.     pop %rax
  230.     stosb
  231.     loop __int_to_str_reverse
  232.     jmp __int_to_str_stack_process
  233. __int_to_str_ret:    
  234.     mov $buf, %rax
  235.     push %rbx
  236.     ret
  237. _str_is_equal:
  238.     pop %rbx
  239.  
  240.     pop %rsi
  241.     pop %rdi
  242.     pop %rcx
  243.  
  244.     push %rbx
  245.     cld
  246.     repe cmpsb
  247.  
  248.     xor %rax, %rax
  249.     jne __str_is_equal_ret
  250.     inc %rax
  251. __str_is_equal_ret:
  252.     ret
  253. _exit:
  254.     mov $60, %rax
  255.     mov $0, %rdi
  256.     syscall
  257.  
  258. .data
  259. b_op1: .ascii "-op1"
  260. l_b_op1 = . - b_op1
  261. b_op2: .ascii "-op2"
  262. l_b_op2 = . - b_op2
  263. op_add: .ascii "--add"
  264. l_op_add = . - op_add
  265. op_sub: .ascii "--sub"
  266. l_op_sub = . - op_sub
  267. op_mul: .ascii "--mul"
  268. l_op_mul = . - op_mul
  269. op_div: .ascii "--div"
  270. l_op_div = . - op_div
  271. buf: .ascii "0                                      \n"
  272. l_buf = . - buf
  273. cnt: .quad 0
  274. op_arguments_table:
  275.     .quad 13 # op1 in 0b
  276.     .quad 14 # op2 in 0b
  277.     .quad _add # address of operation
  278. row: .quad 4
  279. all_row: .quad 24
  280. op_description_table:
  281.     .quad op_add
  282.     .quad l_op_add
  283.     .quad _save_opearation
  284.     .quad _add
  285.    
  286.     .quad op_sub
  287.     .quad l_op_sub
  288.     .quad _save_opearation
  289.     .quad _sub
  290.    
  291.     .quad op_mul
  292.     .quad l_op_mul
  293.     .quad _save_opearation
  294.     .quad _mul
  295.    
  296.     .quad op_div
  297.     .quad l_op_div
  298.     .quad _save_opearation
  299.     .quad _div
  300.  
  301.     .quad b_op1
  302.     .quad l_b_op1
  303.     .quad _translate_operand
  304.     .quad op_arguments_table
  305.  
  306.     .quad b_op2
  307.     .quad l_b_op2
  308.     .quad _translate_operand
  309.     .quad op_arguments_table + 8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement