% macro IO 4
mov rax,% 1
mov rdi,% 2
mov rsi,% 3
mov rdx,% 4
syscall
% endmacro
section .data
m1 db "enter choice (+,-,*, /)" , 10 ; 10d -> line feed
l1 equ $- m1
m2 db "Write a switch case driven X86/64 ALP to perform 64-bit hexadecimal arithmetic operations (+,-,*, /) using suitable macros. Define procedure for each operation." , 10
l2 equ $- m2
m3 db "rahul ghosh 3236" , 10
l3 equ $- m3
madd db "addition here" , 10
l4 equ $- madd
msub db "subtraction here" , 10
l5 equ $- msub
mmul db "multiplication here" , 10
l6 equ $- mmul
mdiv db "division here" , 10
l7 equ $- mdiv
mspace db 10
m_result db "result is "
m_result_l equ $- m_result
m_qou db "qoutient is "
m_qou_l equ $- m_qou
m_rem db "remainder is "
m_rem_l equ $- m_rem
m_default db "enter correct choice" , 10
m_default_l equ $- m_default
section .bss
choice resb 2
_output resq 1
_n1 resq 1
_n2 resq 1
temp_1 resq 1
temp_2 resq 1
section .text
global _start
_start:
IO 1 , 1 , m2, l2
IO 1 , 1 , m3, l3
IO 1 , 1 , m1, l1
IO 0 , 0 , choice, 2
cmp byte [ choice] , '+'
jne case2
call add_fun
case2:
cmp byte [ choice] , '-'
jne case3
call sub_fun
case3:
cmp byte [ choice] , '*'
jne case4
call mul_fun
case4:
cmp byte [ choice] , '/'
jne case5
call div_fun
case5:
cmp byte [ choice] , 'a'
jne error
call add_fun
call sub_fun
call mul_fun
call div_fun
error:
IO 1 , 1 , m_default, m_default_l
mov rax, 60
mov rdi, 0
syscall
add_fun:
IO 1 , 1 , madd, l4
mov qword[ _output] , 0
IO 0 , 0 , _n1, 17
IO 1 , 1 , _n1, 17
call ascii_to_hex
add qword[ _output] , rbx
IO 0 , 0 , _n1, 17
IO 1 , 1 , _n1, 17
call ascii_to_hex
add qword[ _output] , rbx
mov rbx, [ _output]
IO 1 , 1 , mspace, 1
IO 1 , 1 , m_result, m_result_l
call hex_to_ascii
ret
sub_fun:
IO 1 , 1 , msub, l5
mov qword[ _output] , 0
IO 0 , 0 , _n1, 17
IO 1 , 1 , _n1, 17
; IO 1 , 1 , mspace, 1
call ascii_to_hex
add qword[ _output] , rbx
IO 0 , 0 , _n1, 17
IO 1 , 1 , _n1, 17
; IO 1 , 1 , mspace, 1
call ascii_to_hex
sub qword[ _output] , rbx
mov rbx, [ _output]
IO 1 , 1 , mspace, 1
IO 1 , 1 , m_result, m_result_l
call hex_to_ascii
ret
mul_fun:
IO 1 , 1 , mmul, l6 ; message
IO 0 , 0 , _n1, 17 ; n1 input
IO 1 , 1 , _n1, 17
call ascii_to_hex; conversion returns hex value in rbx
mov [ temp_1] , rbx ; storing hex in temp_1
IO 0 , 0 , _n1, 17 ; n2 input
IO 1 , 1 , _n1, 17
call ascii_to_hex
mov [ temp_2] , rbx ; putting hex of n2 in temp_2
mov rax, [ temp_1] ; temp_1-> rax
mov rbx, [ temp_2] ; temp_2-> rbx
mul rbx ; multiplication
push rax
push rdx
IO 1 , 1 , mspace, 1
IO 1 , 1 , m_result, m_result_l
pop rdx
mov rbx, rdx; setting rbx value for conversion
call hex_to_ascii
pop rax
mov rbx, rax; setting rbx value for conversion
call hex_to_ascii ; final output
ret
div_fun:
IO 1 , 1 , mdiv, l7
IO 0 , 0 , _n1, 17 ; n1 input
IO 1 , 1 , _n1, 17
call ascii_to_hex; conversion returns hex value in rbx
mov [ temp_1] , rbx ; storing hex in temp_1
IO 0 , 0 , _n1, 17 ; n2 input
IO 1 , 1 , _n1, 17
call ascii_to_hex
mov [ temp_2] , rbx ; putting hex of n2 in temp_2
mov rax, [ temp_1] ; temp_1-> rax
mov rbx, [ temp_2] ; temp_2-> rbx
xor rdx, rdx
mov rax, [ temp_1] ; temp_1-> rax
mov rbx, [ temp_2] ; temp_2-> rbx
push rax
push rdx
IO 1 , 1 , mspace, 1
IO 1 , 1 , m_rem, m_rem_l
pop rdx
mov rbx, rdx
call hex_to_ascii; remainder output
IO 1 , 1 , mspace, 1
IO 1 , 1 , m_qou, m_qou_l
pop rax
mov rbx, rax
call hex_to_ascii; quotient output
ret
ascii_to_hex:
mov rsi, _n1
mov rcx, 16
xor rbx, rbx
next1:
rol rbx, 4
mov al, [ rsi]
cmp al, 47h
jge error
cmp al, 39h
jbe sub30h
sub al, 7
sub30h:
sub al, 30h
add bl, al
inc rsi
loop next1
ret
hex_to_ascii:
mov rcx, 16
mov rsi, _output
next2:
rol rbx, 4
mov al, bl
and al, 0Fh
cmp al, 9
jbe add30h
add al, 7
add30h:
add al, 30h
mov [ rsi] , al
inc rsi
loop next2
IO 1 , 1 , _output, 16
IO 1 , 1 , mspace, 1
ret
JW1hY3JvIElPIDQKbW92IHJheCwlMQptb3YgcmRpLCUyCm1vdiByc2ksJTMKbW92IHJkeCwlNApzeXNjYWxsCiVlbmRtYWNybwpzZWN0aW9uIC5kYXRhCgltMSBkYiAiZW50ZXIgY2hvaWNlICgrLC0sKiwgLykiICwxMCA7IDEwZCAtPiBsaW5lIGZlZWQgCiAgICBsMSBlcXUgJC1tMSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIG0yIGRiICJXcml0ZSBhIHN3aXRjaCBjYXNlIGRyaXZlbiBYODYvNjQgQUxQIHRvIHBlcmZvcm0gNjQtYml0IGhleGFkZWNpbWFsIGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoKywtLCosIC8pIHVzaW5nIHN1aXRhYmxlIG1hY3Jvcy4gRGVmaW5lIHByb2NlZHVyZSBmb3IgZWFjaCBvcGVyYXRpb24uIiAsMTAgICAKICAgIGwyIGVxdSAkLW0yIAogICAgbTMgZGIgInJhaHVsIGdob3NoIDMyMzYiICwxMCAgICAKICAgIGwzIGVxdSAkLW0zICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgbWFkZCBkYiAiYWRkaXRpb24gaGVyZSIgLDEwICAKICAgIGw0IGVxdSAkLW1hZGQKICAgIG1zdWIgZGIgInN1YnRyYWN0aW9uIGhlcmUiICwxMCAgICAKICAgIGw1IGVxdSAkLW1zdWIKICAgIG1tdWwgZGIgIm11bHRpcGxpY2F0aW9uIGhlcmUiICwxMAogICAgbDYgZXF1ICQtbW11bAogICAgbWRpdiBkYiAiZGl2aXNpb24gaGVyZSIgLDEwCiAgICBsNyBlcXUgJC1tZGl2CiAgICBtc3BhY2UgZGIgMTAKICAgIG1fcmVzdWx0IGRiICJyZXN1bHQgaXMgIgogICAgbV9yZXN1bHRfbCBlcXUgJC1tX3Jlc3VsdAogICAgbV9xb3UgZGIgInFvdXRpZW50IGlzICIKICAgIG1fcW91X2wgZXF1ICQtbV9xb3UKICAgIG1fcmVtIGRiICJyZW1haW5kZXIgaXMgIgogICAgbV9yZW1fbCBlcXUgJC1tX3JlbQogICAgbV9kZWZhdWx0IGRiICJlbnRlciBjb3JyZWN0IGNob2ljZSIsMTAKICAgIG1fZGVmYXVsdF9sIGVxdSAkLW1fZGVmYXVsdApzZWN0aW9uIC5ic3MKICAgIGNob2ljZSByZXNiIDIKICAgIF9vdXRwdXQgcmVzcSAxCiAgICBfbjEgcmVzcSAxCiAgICBfbjIgcmVzcSAxCiAgICB0ZW1wXzEgcmVzcSAxCiAgICB0ZW1wXzIgcmVzcSAxCnNlY3Rpb24gLnRleHQKCWdsb2JhbCBfc3RhcnQKX3N0YXJ0OgogICAgSU8gMSwxLG0yLGwyCiAgICBJTyAxLDEsbTMsbDMKICAgIElPIDEsMSxtMSxsMQogICAgSU8gMCwwLGNob2ljZSwyCiAgICBjbXAgYnl0ZSBbY2hvaWNlXSwnKycKICAgIGpuZSBjYXNlMgogICAgY2FsbCBhZGRfZnVuCiAgICBqbXAgZXhpdApjYXNlMjoKICAgIGNtcCBieXRlIFtjaG9pY2VdLCctJwogICAgam5lIGNhc2UzCiAgICBjYWxsIHN1Yl9mdW4KICAgIGptcCBleGl0CmNhc2UzOgogICAgY21wIGJ5dGUgW2Nob2ljZV0sJyonCiAgICBqbmUgY2FzZTQKICAgIGNhbGwgbXVsX2Z1bgogICAgam1wIGV4aXQKY2FzZTQ6CiAgICBjbXAgYnl0ZSBbY2hvaWNlXSwnLycKICAgIGpuZSBjYXNlNQogICAgY2FsbCBkaXZfZnVuCiAgICBqbXAgZXhpdApjYXNlNToKICAgIGNtcCBieXRlIFtjaG9pY2VdLCdhJwogICAgam5lIGVycm9yCiAgICBjYWxsIGFkZF9mdW4KICAgIGNhbGwgc3ViX2Z1bgogICAgY2FsbCBtdWxfZnVuCiAgICBjYWxsIGRpdl9mdW4KICAgIGptcCBleGl0CmVycm9yOgogICAgSU8gMSwxLG1fZGVmYXVsdCxtX2RlZmF1bHRfbAogICAgam1wIGV4aXQKZXhpdDoJCgltb3YgcmF4LCA2MAoJbW92IHJkaSwgMAoJc3lzY2FsbAphZGRfZnVuOgogICAgSU8gMSwxLG1hZGQsbDQKICAgIG1vdiBxd29yZFtfb3V0cHV0XSwwCiAgICBJTyAwLDAsX24xLDE3CiAgICBJTyAxLDEsX24xLDE3CiAgICBjYWxsIGFzY2lpX3RvX2hleAogICAgYWRkIHF3b3JkW19vdXRwdXRdLHJieAogICAgSU8gMCwwLF9uMSwxNwogICAgSU8gMSwxLF9uMSwxNwogICAgY2FsbCBhc2NpaV90b19oZXgKICAgIGFkZCBxd29yZFtfb3V0cHV0XSxyYngKICAgIG1vdiByYngsW19vdXRwdXRdCiAgICBJTyAxLDEsbXNwYWNlLDEKICAgIElPIDEsMSxtX3Jlc3VsdCxtX3Jlc3VsdF9sCiAgICBjYWxsIGhleF90b19hc2NpaQogICAgcmV0CnN1Yl9mdW46CiAgICBJTyAxLDEsbXN1YixsNQogICAgbW92IHF3b3JkW19vdXRwdXRdLDAKICAgIElPIDAsMCxfbjEsMTcKICAgIElPIDEsMSxfbjEsMTcKICAgIDtJTyAxLDEsbXNwYWNlLDEKICAgIGNhbGwgYXNjaWlfdG9faGV4CiAgICBhZGQgcXdvcmRbX291dHB1dF0scmJ4CiAgICBJTyAwLDAsX24xLDE3CiAgICBJTyAxLDEsX24xLDE3CiAgICA7SU8gMSwxLG1zcGFjZSwxCiAgICBjYWxsIGFzY2lpX3RvX2hleAogICAgc3ViIHF3b3JkW19vdXRwdXRdLHJieAogICAgbW92IHJieCxbX291dHB1dF0KICAgIElPIDEsMSxtc3BhY2UsMQogICAgSU8gMSwxLG1fcmVzdWx0LG1fcmVzdWx0X2wKICAgIGNhbGwgaGV4X3RvX2FzY2lpCiAKICAgIHJldAptdWxfZnVuOgogICAgSU8gMSwxLG1tdWwsbDYgOyBtZXNzYWdlCiAgICBJTyAwLDAsX24xLDE3ICAgIDsgbjEgaW5wdXQKICAgIElPIDEsMSxfbjEsMTcKICAgIGNhbGwgYXNjaWlfdG9faGV4OyBjb252ZXJzaW9uIHJldHVybnMgaGV4IHZhbHVlIGluIHJieAogICAgbW92IFt0ZW1wXzFdLHJieCA7IHN0b3JpbmcgaGV4IGluIHRlbXBfMQogICAgSU8gMCwwLF9uMSwxNyAgICA7bjIgaW5wdXQKICAgIElPIDEsMSxfbjEsMTcKICAgIGNhbGwgYXNjaWlfdG9faGV4CiAgICBtb3YgW3RlbXBfMl0scmJ4IDsgcHV0dGluZyBoZXggb2YgbjIgaW4gdGVtcF8yCiAgICBtb3YgcmF4LFt0ZW1wXzFdIDsgdGVtcF8xLT5yYXgKICAgIG1vdiByYngsW3RlbXBfMl0gO3RlbXBfMi0+cmJ4CiAgICBtdWwgcmJ4ICAgICAgICAgIDsgbXVsdGlwbGljYXRpb24KICAgIHB1c2ggcmF4CiAgICBwdXNoIHJkeAogICAgSU8gMSwxLG1zcGFjZSwxCiAgICBJTyAxLDEsbV9yZXN1bHQsbV9yZXN1bHRfbAogICAgcG9wIHJkeAogICAgbW92IHJieCxyZHg7IHNldHRpbmcgcmJ4IHZhbHVlIGZvciBjb252ZXJzaW9uCiAgICBjYWxsIGhleF90b19hc2NpaQogICAgcG9wIHJheCAKICAgIG1vdiByYngscmF4OyBzZXR0aW5nIHJieCB2YWx1ZSBmb3IgY29udmVyc2lvbgogICAgY2FsbCBoZXhfdG9fYXNjaWkgIDsgZmluYWwgb3V0cHV0CnJldApkaXZfZnVuOgogICAgSU8gMSwxLG1kaXYsbDcKICAgIElPIDAsMCxfbjEsMTcgICAgOyBuMSBpbnB1dAogICAgSU8gMSwxLF9uMSwxNwogICAgY2FsbCBhc2NpaV90b19oZXg7IGNvbnZlcnNpb24gcmV0dXJucyBoZXggdmFsdWUgaW4gcmJ4CiAgICBtb3YgW3RlbXBfMV0scmJ4IDsgc3RvcmluZyBoZXggaW4gdGVtcF8xCiAgICBJTyAwLDAsX24xLDE3ICAgIDtuMiBpbnB1dAogICAgSU8gMSwxLF9uMSwxNwogICAgY2FsbCBhc2NpaV90b19oZXgKICAgIG1vdiBbdGVtcF8yXSxyYnggOyBwdXR0aW5nIGhleCBvZiBuMiBpbiB0ZW1wXzIKICAgIG1vdiByYXgsW3RlbXBfMV0gOyB0ZW1wXzEtPnJheAogICAgbW92IHJieCxbdGVtcF8yXSA7dGVtcF8yLT5yYngKICAgIHhvciByZHgscmR4IAogICAgbW92IHJheCxbdGVtcF8xXSA7IHRlbXBfMS0+cmF4CiAgICBtb3YgcmJ4LFt0ZW1wXzJdIDsgdGVtcF8yLT5yYngKICAgIGRpdiByYnggOyBkaXYKICAgIHB1c2ggcmF4CiAgICBwdXNoIHJkeAogICAgSU8gMSwxLG1zcGFjZSwxCiAgICBJTyAxLDEsbV9yZW0sbV9yZW1fbAogICAgcG9wIHJkeAogICAgbW92IHJieCxyZHgKICAgIGNhbGwgaGV4X3RvX2FzY2lpOyByZW1haW5kZXIgb3V0cHV0CiAgICBJTyAxLDEsbXNwYWNlLDEKICAgIElPIDEsMSxtX3FvdSxtX3FvdV9sCiAgICBwb3AgcmF4CiAgICBtb3YgcmJ4LHJheAogICAgY2FsbCBoZXhfdG9fYXNjaWk7IHF1b3RpZW50IG91dHB1dAogICAgcmV0CmFzY2lpX3RvX2hleDoKICAgIG1vdiByc2ksIF9uMQoJbW92IHJjeCwgMTYgICAgIAoJeG9yIHJieCwgcmJ4CgluZXh0MToKCQlyb2wgcmJ4LCA0CgkJbW92IGFsLCBbcnNpXSAgICAKCQljbXAgYWwsNDdoICAgICAgICAKICAgIAlqZ2UgZXJyb3IgICAgICAgICAKCQljbXAgYWwsIDM5aAkgICAgIAoJCWpiZSBzdWIzMGgJICAgICAKCQlzdWIgYWwsIDcKCQlzdWIzMGg6CgkJCXN1YiBhbCwgMzBoCgkJYWRkIGJsLCBhbAoJCWluYyByc2kKCQlsb29wIG5leHQxCnJldApoZXhfdG9fYXNjaWk6Cgltb3YgcmN4LCAxNgoJbW92IHJzaSxfb3V0cHV0CgluZXh0MjoKCQlyb2wgcmJ4LCA0CgkJbW92IGFsLCBibAoJCWFuZCBhbCwgMEZoCgkJY21wIGFsLCA5CgkJamJlIGFkZDMwaAoJCWFkZCBhbCwgNwogICAgICAgIGFkZDMwaDoKCQlhZGQgYWwsIDMwaAoJCW1vdiBbcnNpXSwgYWwKCQlpbmMgcnNpCgkJbG9vcCBuZXh0MgoJCUlPIDEsMSxfb3V0cHV0LDE2CgkJSU8gMSwxLG1zcGFjZSwxCnJldA==