#---------------------------------------------------------------- # Program lab_6a.s - Architektury Komputerów #---------------------------------------------------------------- # # To compile&link: gcc -no-pie -o lab_6a lab_6a.s # To run: ./lab_6a # #---------------------------------------------------------------- .data oper_and: .string "AND" # AND operation oper_or: .string "OR" # OR operation oper_xor: .string "XOR" # XOR operation oper_add: .string "ADD" # ADD operation oper_sub: .string "SUB" # SUB operation var_a: .long 3084 # first number var_b: .long 1424 # second number var_res: .long 0 # result var_oper: .long 0 # number of operation fmt_oper: .string "%d (0x%08x) %s %d (0x%08x) = " # operation format string fmt_res: .string "%d (0x%08x)\n" # result format string fmt_bad: .string "No or bad numbers!\n" # format for bad arguments fmt_err: .string "Bad operation!\n" # format for bad operations #---------------------------------------------------------------- .text .global main #---------------------------------------------------------------- main: push %rbp cmp $4, %edi # argc is here jnz badnum mov %rsi, %rbp # %rbp = %rsi = argv mov 8(%rbp), %rdi # atoi( argv[1] ) - 1st argument to %rdi; call atoi cmp $0, %rax # result of conversion jle badnum # bad number mov %eax, var_a # store numer in var_a mov 16(%rbp), %rdi # atoi( argv[2] ) - 1st argument to %rdi; call atoi cmp $0, %rax # result of conversion jle badnum # bad number mov %eax, var_b # store numer in var_b mov 24(%rbp), %rdi # atoi( argv[3] ) - 1st argument to %rdi; call atoi cmp $0, %rax # result of conversion jle badnum # bad number mov %eax, var_oper # store numer in var_oper mov var_a, %rdx # %rdx contains var_a mov var_b, %rcx # %rcx contains var_b cmp $3, %eax # check for number of first operation jnz check_5 # != 3, so check others and %rcx, %rdx # result in %rdx mov $oper_and, %rcx # name in %rcx jmp display # jump to display code check_5: cmp $5, %eax # check for number of second operation jnz check_6 # != 5, so check others or %rcx, %rdx # result in %rdx mov $oper_or, %rcx # name in %rcx jmp display # jump to display code check_6: cmp $6, %eax # check for number of third operation jnz check_10 # != 6, so check others xor %rcx, %rdx # result in %rdx mov $oper_xor, %rcx # name in %rcx jmp display # jump to display code check_10: cmp $10, %eax # check for number of fourth operation jnz check_15 # != 10, so check others add %rcx, %rdx # result in %rdx mov $oper_add, %rcx # name in %rcx jmp display # jump to display code check_15: cmp $15, %eax # check for number of fifth operation jnz oper_err # != 15, so error sub %rcx, %rdx # result in %rdx mov $oper_sub, %rcx # name in %rcx jmp display # jump to display code oper_err: mov $fmt_err, %rdi # printf( fmt ) - first argument to %rdi mov $0, %al # printf - number of vector registers to %al call printf jmp theend display: mov %rdx, var_res # store result in var_res mov var_b, %r9 # printf( fmt, n1, n1, name, n2, n2 ) - 6th argument to %r9 mov var_b, %r8 # printf( fmt, n1, n1, name, n2, n2 ) - 5th argument to %r8 mov var_a, %rdx # printf( fmt, n1, n1, name, n2, n2 ) - 3rd argument to %rdx mov var_a, %rsi # printf( fmt, n1, n1, name, n2, n2 ) - 2nd argument to %rsi mov $fmt_oper, %rdi # printf( fmt, n1, n1, name, n2, n2 ) - 1st argument to %rdi mov $0, %al # printf - number of vector registers to %al call printf mov var_res, %rdx # printf( fmt, res, res ) - 3rd argument to %rdx mov var_res, %rsi # printf( fmt, res, res ) - 2nd argument to %rsi mov $fmt_res, %rdi # printf( fmt, res, res ) - 1st argument to %rdi mov $0, %al # printf - number of vector registers to %al call printf jmp theend badnum: mov $fmt_bad, %rdi # printf( fmt ) - first argument to %rdi mov $0, %al # printf - number of vector registers to %al call printf theend: pop %rbp ret