Uploaded by atharvatirkhunde

MPL Practical

advertisement
PROGRAM 1:
section .data
msg db "Enter a String:", 0ah
msg_len equ $-msg
%macro print 2
mov rax, 1
mov rdi, 1
mov rsi, %1
mov rdx, %2
syscall
%endmacro
%macro write 2
mov rax, 0
mov rdi, 0
mov rsi, %1
mov rdx, %2
syscall
%endmacro
%macro exit 0
mov rax, 60
mov rdi, 0
syscall
%endmacro
section .bss
str1 resb 200
section .text
global _start
_start:
print msg,msg_len
write str1,200
print str1,200
exit
OUTPUT:
$ cd ~/Downloads
$ nasm -f elf64 ass1.asm
$ ld -o ass1 ass1.o
$ ./ass1
Enter a String: Hello World
Hello World
PROGRAM 2:
section .data
msg1 db 10,13,"Enter 5 64 bit numbers"
len1 equ $-msg1
msg2 db 10,13,"Entered 5 64 bit numbers"
len2 equ $-msg2
section .bss
array resd 200
counter resb 1
section .text
global _start
_start:
;display
mov Rax,1
mov Rdi,1
mov Rsi,msg1
mov Rdx,len1
syscall
;accept
mov byte[counter],05
mov rbx,00
loop1:
mov rax,0
; 0 for read
mov rdi,0
; 0 for keyboard
mov rsi, array
;move pointer to start of array
add rsi,rbx
mov rdx,17
syscall
add rbx,17
;to move counter
dec byte[counter]
JNZ loop1
;display
mov Rax,1
mov Rdi,1
mov Rsi,msg2
mov Rdx,len2
syscall
;display
mov byte[counter],05
mov rbx,00
loop2:
mov rax,1
;1 for write
mov rdi, 1
;1 for monitor
mov rsi, array
add rsi,rbx
mov rdx,17
;16 bit +1 for enter
syscall
add rbx,17
dec byte[counter]
JNZ loop2
;exit system call
mov rax ,60
mov rdi,0
syscall
OUTPUT:
$ cd ~/Downloads
$ nasm -f elf64 ass1.asm
$ ld -o ass1 ass1.o
$ ./ass1
Enter 5 64 bit numbers
42
18
59
36
53
Entered 5 64 bit numbers
42
18
59
36
53
PROGRAM 3:
section .data
msg1 db 10,13,"Enter a string:"
len1 equ $-msg1
%macro dispmsg 2
mov Rax,1
mov Rdi,1
mov Rsi,%1
mov Rdx,%2
syscall
%endmacro
%macro write 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro exit 0
mov Rax ,60
mov Rdi,0
syscall
%endmacro
section .bss
str1 resb 200
result resb 16
section .text
global _start
_start:
;display
dispmsg msg1,len1
;store string
write str1,200
call display
;exit system call
exit
;string declaration
display:
mov rbx,rax
mov rdi,result
mov cx,16
; store no in rbx
;point rdi to result variable
;load count of rotation in cl
up1:
rol rbx,04
mov al,bl
and al,0fh
cmp al,09h
jg add_37
add al,30h
jmp skip
;rotate no of left by four bits
; move lower byte in al
;get only LSB
;compare with 39h
;if greater than 39h skip add 37
;else add 30
add_37:
add al,37h
skip:
mov [rdi],al
;store ascii code in result variable
inc rdi
; point to next byte
dec cx
; decrement counter
jnz up1
; if not zero jump to repeat
dispmsg result,16
;call to macro
ret
OUTPUT:
$ cd ~/Downloads
$ nasm -f elf64 ass2.asm
$ ld -o ass2 ass2.o
$ ./ass2
Enter a string:
Hello World
11
PROGRAM 4:
section .data
menumsgdb 10,'****** Menu ******',
db 10,'+: Addition'
db 10,'-: Subtraction'
db 10,'*: Multiplication'
db 10,'/: Division'
db 10,10,'Enter your choice:: '
menumsg_len: equ $-menumsg
addmsgdb 10,'Welcome to additon',10
addmsg_lenequ $-addmsg
submsgdb 10,'Welcome to subtraction',10
submsg_lenequ $-submsg
mulmsgdb 10,'Welcome to Multiplication',10
mulmsg_lenequ $-mulmsg
divmsgdb 10,'Welcome to Division',10
divmsg_lenequ $-divmsg
wrchmsgdb 10,10,'Wrong CHoice Entered...!',10
wrchmsg_lenequ $-wrchmsg
no1 dq 0ff05h
no2 dq 0ffh
resmsgdb 10,'Result is:'
resmsg_lenequ $-resmsg
qmsgdb 10,'Quotient::'
qmsg_lenequ $-qmsg
rmsgdb 10,'Remainder::'
rmsg_lenequ $-rmsg
nwmsgdb 10
reshdq 0
resldq 0
section .bss
accbuffresb 2
dispbuffresb 16
%macro print 2
moveax, 4
movebx, 1
movecx, %1
movedx, %2
int 80h
%endmacro
section .text
global _start
start: print menumsg,menumsg_len
mov eax,03
mov ebx,01
movecx,accbuff
mov edx,02
int 80h
cmp byte [accbuff],'+'
jne case2
call add_proc
jmp exit
case2:
cmp byte [accbuff],'-'
jne case3
call sub_proc
jmp exit
case3:
cmp byte [accbuff],'*'
jne case4
call mul_proc
jmp exit
case4:
cmp byte [accbuff],'/'
jnecaseinv
call div_proc
jmp exit
caseinv:printwrchmsg,wrchmsg_len
exit: mov eax,01
mov ebx,0
int 80h
add_proc:
print addmsg,addmsg_len
movrax,[no1]
add rax,[no2]
jnc addnxt1
inc qword [resh]
addnxt1:
mov [resl],rax
print resmsg,resmsg_len
movrbx,[resh]
call disp64num
movrbx,[resl]
call disp64num
print nwmsg,1
ret
sub_proc:
print submsg,submsg_len
movrax,[no1]
sub rax,[no2]
jnc addnxt1
inc qword [resh]
subnxt1:
mov [resl],rax
print resmsg,resmsg_len
movrbx,[resh]
call disp64num
movrbx,[resl]
call disp64num
print nwmsg,1
ret
mul_proc:
print mulmsg,mulmsg_len
movrax,[no1]
movrbx,[no2]
mulrbx
mov [resh],rdx
mov [resl],rax
print resmsg,resmsg_len
movrbx,[resh]
call disp64num
movrbx,[resl]
call disp64num
print nwmsg,1
ret
div_proc:
print divmsg,divmsg_len
movrax,[no1]
mov rdx,0
movrbx,[no2]
div rbx
mov [resh],rdx ;Remainder
mov [resl],rax ;Quotient
print rmsg,rmsg_len
movrbx,[resh]
call disp64num
print qmsg,qmsg_len
movrbx,[resl]
call disp64num
print nwmsg,1
ret
disp64num:
mov ecx,16
movedi,dispbuff
dup1:
rol rbx,4
moval,bl
and al,0fh
cmp al,09
jbedskip
add al,07h
dskip: add al,30h
mov [edi],al
incedi
loop dup1
print dispbuff,16
ret
OUTPUT:
$ nasm -f elf64 msmalsw.asm
$ ld -o msmalswmsmalsw.o
$ ./msmalsw
****** Menu ******
+: Addition
-: Subtraction
*: Multiplication
/: Division
Enter your choice:: +
Welcome to addition
Result is:00000000000000000000000000010004
$ ./msmalsw
****** Menu ******
+: Addition
-: Subtraction
*: Multiplication
/: Division
Enter your choice:: -
Welcome to subtraction
Result is:0000000000000000000000000000FE06
$ ./msmalsw
****** Menu ******
+: Addition
-: Subtraction
*: Multiplication
/: Division
Enter your choice:: *
Welcome to Multiplication
Result is:00000000000000000000000000FE05FB
$ ./msmalsw
****** Menu ******
+: Addition
-: Subtraction
*: Multiplication
/: Division
Enter your choice:: /
Welcome to Division
Remainder::0000000000000005
Quotient::0000000000000100
PROGRAM 5:
section .data
welmsg db 10,'Count positive and negative numbers in an array',10
welmsg_len equ $-welmsg
arr64 dq -53H,36H,-15H,94H,25H
n equ 5
pmsg db 10,"The no of Positive elements from 64-bit array :"
pmsg_len equ $-pmsg
nmsg db 10,"The no of Negative elements from 64-bit array :"
nmsg_len equ $-nmsg
section .bss
p_count resq 1
n_count resq 1
char_ans resb 2
%macro print 2
mov rax, 1
mov rdi, 1
mov rsi, %1
mov rdx, %2
syscall
%endmacro
%macro read 2
mov rax, 0
mov rdi, 0
mov rsi, %1
mov rdx, %2
syscall
%endmacro
%macro exit 0
mov rax, 60
mov rdi, 0
syscall
%endmacro
section .text
global _start
_start:
print welmsg,welmsg_len
mov rsi,arr64
mov rcx,n
mov rbx,0
mov rdx,0
next_num:
mov rax,[rsi]
shl rax,1
jc negative
positive:
inc rbx
jmp next
negative:
inc rdx
jmp next
next:
add rsi,8
dec rcx
jnz next_num
mov [p_count],rbx
mov [n_count],rdx
print pmsg,pmsg_len
mov rax,[p_count]
call disp64_proc
print nmsg,nmsg_len
mov rax,[n_count]
call disp64_proc
exit
disp64_proc:
mov rbx,16
mov rcx,2
mov rsi,char_ans+1
cnt:
mov rdx,0
div rbx
cmp dl,09h
jbe add30
add dl,07h
add30:
add dl,30h
mov [rsi],dl
dec rsi
dec rcx
jnz cnt
print char_ans,2
ret
OUTPUT:
$ cd ~/Downloads
$ nasm -f elf64 ass5.asm
$ ld -o ass5 ass5.o
$ ./ass5
Count positive and negative numbers in an array
The no of Positive elements from 64-bit array :03
The no of Negative elements from 64-bit array :02
PROGRAM 6:
section .data
array db 10h,20h,30h,40h,50h
msg1: db 'Before overlapped :',0xa
len1: equ $-msg1
msg2: db 'After overlapped :',0xa
len2: equ $-msg2
msg3: db ' ',0xa
len3: equ $-msg3
msg4: db ' : '
len4: equ $-msg4
count db 0
count1 db 0
count2 db 0
count3 db 0
count4 db 0
section .bss
addr resb 16
num1 resb 2
section .text
global _start
_start:
mov rax,1
mov rdi,1
mov rsi,msg1
mov rdx,len1
syscall
xor rsi,rsi
mov rsi,array
mov byte[count],05
up:
mov rbx,rsi
push rsi
mov rdi,addr
call HtoA1
pop rsi
mov dl,[rsi]
push rsi
mov rdi,num1
call HtoA2
pop rsi
inc rsi
dec byte[count]
jnz up
mov rsi,array
mov rdi,array+5h
mov byte[count3],05h
loop10:
mov dl,00h
mov dl,byte[rsi]
mov byte[rdi],dl
inc rsi
inc rdi
dec byte[count3]
jnz loop10
mov rax,1
mov rdi,1
mov rsi,msg2
mov rdx,len2
syscall
mov rsi,array
mov byte[count4],0Ah
up10:
mov rbx,rsi
push rsi
mov rdi,addr
call HtoA1
pop rsi
mov dl,[rsi]
push rsi
mov rdi,num1
call HtoA2
pop rsi
inc rsi
dec byte[count4]
jnz up10
mov rax,60
mov rdi,0
syscall
HtoA1:
mov byte[count1],16
dup1:
rol rbx,4
mov al,bl
and al,0fh
cmp al,09
jg p3
add al,30h
jmp p4
p3: add al,37h
p4:mov [rdi],al
inc rdi
dec byte[count1]
jnz dup1
mov rax,1
mov rdi,1
mov rsi,addr
mov rdx,16
syscall
mov rax,1
mov rdi,1
mov rsi,msg4
mov rdx,len4
syscall
ret
HtoA2:
mov byte[count2],02
dup2:
rol dl,04
mov al,dl
and al,0fh
cmp al,09h
jg p31
add al,30h
jmp p41
p31: add al,37h
p41:mov [rdi],al
inc rdi
dec byte[count2]
jnz dup2
mov rax,1
mov rdi,1
mov rsi,num1
mov rdx,02
syscall
mov rax,1
mov rdi,1
mov rsi,msg3
mov rdx,len3
syscall
ret
OUTPUT:
$ nasm -f elf64 nonover_string.asm
$ ld -o nonover_string nonover_string.o
$ ./nonover_string
Before overlapped :
0000000000600270 : 10
0000000000600271 : 20
0000000000600272 : 30
0000000000600273 : 40
0000000000600274 : 50
After overlapped :
0000000000600270 : 10
0000000000600271 : 20
0000000000600272 : 30
0000000000600273 : 40
0000000000600274 : 50
0000000000600275 : 10
0000000000600276 : 20
0000000000600277 : 30
0000000000600278 : 40
0000000000600279 : 50
PROGRAM 7:
section .data
array db 10h,20h,30h,40h,50h
msg1: db 'Before overlapped :',0xa
len1: equ $-msg1
msg2: db 'After overlapped :',0xa
len2: equ $-msg2
msg3: db ' ',0xa
len3: equ $-msg3
msg4: db ' : '
len4: equ $-msg4
count db 0
count1 db 0
count2 db 0
count3 db 0
count4 db 0
count5 db 0
section .bss
addr resb 16
num1 resb 2
section .text
global _start
_start:
mov rax,1
mov rdi,1
mov rsi,msg1
mov rdx,len1
syscall
xor rsi,rsi
mov rsi,array
mov byte[count],05
up:
mov rbx,rsi
push rsi
mov rdi,addr
call HtoA1
pop rsi
mov dl,[rsi]
push rsi
mov rdi,num1
call HtoA2
pop rsi
inc rsi
dec byte[count]
jnz up
mov rsi,array
mov rdi,array+0Ah
mov byte[count3],05h
loop10:
mov dl,00h
movsb
dec byte[count3]
jnz loop10
xor rsi,rsi
mov rsi,array+3h
mov rdi,array+0Ah
mov byte[count5],05h
loop11:
mov dl,byte[rdi]
mov byte[rsi],dl
inc rsi
inc rdi
dec byte[count5]
jnz loop11
mov rax,1
mov rdi,1
mov rsi,msg2
mov rdx,len2
syscall
xor rsi,rsi
mov rsi,array
mov byte[count4],08h
up10:
mov rbx,rsi
push rsi
mov rdi,addr
call HtoA1
pop rsi
mov dl,[rsi]
push rsi
mov rdi,num1
call HtoA2
pop rsi
inc rsi
dec byte[count4]
jnz up10
mov rax,60
mov rdi,0
syscall
HtoA1:
mov byte[count1],16
dup1:
rol rbx,4
mov al,bl
and al,0fh
cmp al,09
jg p3
add al,30h
jmp p4
p3: add al,37h
p4:mov [rdi],al
inc rdi
dec byte[count1]
jnz dup1
mov rax,1
mov rdi,1
mov rsi,addr
mov rdx,16
syscall
mov rax,1
mov rdi,1
mov rsi,msg4
mov rdx,len4
syscall
ret
HtoA2:
mov byte[count2],02
dup2:
rol dl,04
mov al,dl
and al,0fh
cmp al,09h
jg p31
add al,30h
jmp p41
p31: add al,37h
p41:mov [rdi],al
inc rdi
dec byte[count2]
jnz dup2
mov rax,1
mov rdi,1
mov rsi,num1
mov rdx,02
syscall
mov rax,1
mov rdi,1
mov rsi,msg3
mov rdx,len3
syscall
ret
OUTPUT:
$ nasm -f elf64 wt_over.asm
$ ld -o wt_over wt_over.o
$ ./wt_over
Before overlapped :
000000000060029C : 10
000000000060029D : 20
000000000060029E : 30
000000000060029F : 40
00000000006002A0 : 50
After overlapped :
000000000060029C : 10
000000000060029D : 20
000000000060029E : 30
000000000060029F : 10
00000000006002A0 : 20
00000000006002A1 : 30
00000000006002A2 : 40
00000000006002A3 : 50
PROGRAM 8:
section .data
msg db 'Enter two digit Number::',0xa
msg_len equ $-msg
res db 10,'Multiplication of elements is::'
res_len equ $-res
choice db 'Enter your Choice:',0xa
db'1.Successive Addition',0xa
db '2.Add and Shift method',0xa
db '3.Exit',0xa
choice_len equ $-choice
section .bss
num resb 03
num1 resb 01
result resb 04
cho resb 2
section .text
global _start
_start:
xor rax,rax
xor rbx,rbx
xor rcx,rcx
xor rdx,rdx
mov byte[result],0
mov byte[num],0
mov byte[num1],0
mov rax,1
mov rdi,1
mov rsi,choice
mov rdx,choice_len
syscall
mov rax,0
mov rdi,0
mov rsi,cho
mov rdx,2
syscall
cmp byte[cho],31h
;; comparing choice
je a
cmp byte[cho],32h
je b
jmp exit
a: call Succe_addition
jmp _start
b: call Add_shift
jmp _start
exit:
mov rax,60
mov rdi,0
syscall
convert:
xor rbx,rbx
xor rcx,rcx
xor rax,rax
;; ASCII to Hex conversion
mov rcx,02
mov rsi,num
up1:
rol bl,04
mov al,[rsi]
cmp al,39h
jbe p1
sub al,07h
jmp p2
p1: sub al,30h
p2: add bl,al
inc rsi
loop up1
ret
display:
mov rcx,4
mov rdi,result
dup1:
rol bx,4
mov al,bl
and al,0fh
cmp al,09h
jbe p3
add al,07h
jmp p4
p3: add al,30h
p4:mov [rdi],al
;; Hex to ASCII conversion
inc rdi
loop dup1
mov rax,1
mov rdi,1
mov rsi,result
mov rdx,4
syscall
ret
Succe_addition:
mov rax,1
mov rdi,1
mov rsi,msg
mov rdx,msg_len
syscall
mov rax,0
mov rdi,0
mov rsi,num
mov rdx,3
syscall
call convert
mov [num1],bl
mov rax,1
mov rdi,1
mov rsi,msg
mov rdx,msg_len
syscall
mov rax,0
mov rdi,0
mov rsi,num
mov rdx,3
syscall
call convert
xor rcx,rcx
xor rax,rax
mov rax,[num1]
repet:
add rcx,rax
dec bl
jnz repet
mov [result],rcx
mov rax,1
mov rdi,1
mov rsi,res
mov rdx,res_len
syscall
mov rbx,[result]
call display
ret
Add_shift:
mov rax,1
mov rdi,1
mov rsi,msg
mov rdx,msg_len
syscall
mov rax,0
mov rdi,0
mov rsi,num
mov rdx,3
syscall
call convert
mov [num1],bl
mov rax,1
mov rdi,1
mov rsi,msg
mov rdx,msg_len
syscall
mov rax,0
mov rdi,0
mov rsi,num
mov rdx,3
syscall
call convert
mov [num],bl
xor rbx,rbx
xor rcx,rcx
xor rdx,rdx
xor rax,rax
mov dl,08
mov al,[num1]
mov bl,[num]
p11:
shr bx,01
jnc p
add cx,ax
p:
shl ax,01
dec dl
jnz p11
mov [result],rcx
mov rax,1
mov rdi,1
mov rsi,res
mov rdx,res_len
syscall
;dispmsg res,res_len
mov rbx,[result]
call display
ret
OUTPUT:
Enter your Choice:
1.Successive Addition
2.Add and Shift method
3.Exit
1
Enter two digit Number::
02
Enter two digit Number::
02
Multiplication of elements is::0004Enter your Choice:
1.Successive Addition
2.Add and Shift method
3.Exit
2
Enter two digit Number::
03
Enter two digit Number::
03
Multiplication of elements is::0009Enter your Choice:
1.Successive Addition
2.Add and Shift method
3.Exit
3
PROGRAM 9:
section .data
msg : db "File does not exist ",0AH
len : equ $-msg
msg1 : db "File successfully copied",0AH
len1 : equ $-msg1
msg3 : db "Enter the data to be typed in the file",0AH
len3 : equ $-msg3
buffer : times 1000 db ' '
filelen : dq 0
section .bss
filedes_1 : resq 1
filedes_2 : resq 1
filename_1 : resb 16
filename_2 : resb 16
choice : resb 8
section .txt
global _start
%macro print 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro read 2
mov rax,0
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
_start:
pop rbx
pop rbx
; REMOVE THE NUMMBER OF ARGUMENS FROM THE STACK
;REMOVE EXECUTABLE PROGRAM NAME FROM THE STACK
pop rbx ; GET THE FIRST ARGUMENT
;READ THE CHOICE i.e COPY OR TYPE
mov [choice],rbx
mov rsi,qword[choice]
cmp byte[rsi],43H
je copy
cmp byte[rsi],44H
je Delete
jmp type
;---------------COPY FROM ONE FILE TO ANOTHER FILE-------------------------->
copy:
pop rbx
mov rsi,filename_1
up_1: mov al,byte[rbx]
mov byte[rsi],al
inc rsi
inc rbx
cmp byte[rbx],0H
jne up_1
pop rbx
mov rsi,filename_2
up_2: mov al,byte[rbx]
mov byte[rsi],al
inc rbx
inc rsi
cmp byte[rbx],0H
jne up_2
;OPENING FIRST FILE
mov rax,2
mov rdi,filename_1 ;FIRST FILE NAME
mov rsi,2 ; WR MODE
mov rdx,0777 ; Permissions given to the file user,Owner,group is read and write and execute
syscall
;CHECKING IF FILE EXIST
bt rax,63
jc NoFile
mov [filedes_1],rax ; if exists the saving hte file descriptor
;OPENING SECOND FILE
mov rax,2
mov rdi,filename_2 ;SECOND FILE NAME
mov rsi,2 ; WR MODE
mov rdx,0777 ; Permissions given to the file user,Owner,group is read and write and execute
syscall
;CHECKING IF FILE EXIST
cmp rax,0
jle NoFile
mov [filedes_2],rax ; if exists the saving the file descriptor
;READING FIRST FILE
mov rax,0
mov rdi,qword[filedes_1]
mov rsi,buffer
mov rdx,100
syscall
;SAVING THE LENGHT OF FIRST FILE
mov qword[filelen],rax
;WRITING TO SECOND FILE
mov rax,1
mov rdi,qword[filedes_2]
mov rsi,buffer
mov rdx,qword[filelen]
syscall
;CLOSING THE FILES
mov rax,3
mov rdi,filedes_1
syscall
mov rax,3
mov rdi,filedes_2
syscall
;PRINTING MESSAGE
print msg1,len1
jmp exit
;<------------------TYPE IN THE FILE ----------------------->
type :
;SAVING FILE NAME
pop rbx
mov rsi,filename_1
up_4: mov al,byte[rbx]
mov byte[rsi],al
inc rsi
inc rbx
cmp byte[rbx],0H
jne up_4
;OPENING THE FILE
mov rax,2
mov rdi,filename_1 ;FIRST FILE NAME
mov rsi,2 ; APPEND MODE
mov rdx,0777 ; Permissions given to the file user,Owner,group is read and write and execute
syscall
;CHECKING IF FILE EXIST
cmp rax,1
je NoFile
mov [filedes_1],rax
;READING THE INPUT FROM THE SCREEN
print msg3,len3
read buffer,1000
;WRITING TO THE FILE
mov rax,1
mov rdi,qword[filedes_1]
mov rsi,buffer
mov rdx,1000
syscall
;CLOSING THE FILES
mov rax,3
mov rdi,filedes_1
syscall
jmp exit
;<-------------------PRINT FILE------------------------>
NoFile :
print msg,len
jmp exit
;<--------------TERMINATING THE PROGRAM--------------->
exit:
mov rax,60
mov rdi,0
syscall
OUTPUT:
$ nasm -f elf64 p.asm
$ ld -o p p.o
$ ./p COPY a.txt b.txt
$ ./p TYPE a.txt
PROGRAM 10:
section .data
msgFact: db 'Factorial is:',0xa
msgFactSize: equ $-msgFact
newLine: db 10
section .bss
fact: resb 8
num: resb 2
section .txt
global _start
_start:
pop rbx ;Remove number of arguments
pop rbx ;Remove the program name
pop rbx ;Remove the actual number whoes factorial is to be calculated (Address of number)
mov [num],rbx
;print number accepted from command line
mov rax,1
mov rdi,1
mov rsi,[num]
mov rdx,2
syscall
mov rsi,[num]
mov rcx,02
xor rbx,rbx
call aToH
mov rax,rbx
call factP
mov rcx,08
mov rdi,fact
xor bx,bx
mov ebx,eax
call hToA
mov rax,1
mov rdi,1
mov rsi,newLine
mov rdx,1
syscall
mov rax,1
mov rdi,1
mov rsi,fact
mov rdx,8
syscall
mov rax,1
mov rdi,1
mov rsi,newLine
mov rdx,1
syscall
mov rax,60
mov rdi,0
syscall
factP:
dec rbx
cmp rbx,01
je comeOut
cmp rbx,00
je comeOut
mul rbx
call factP
comeOut:
ret
aToH:
up1: rol bx,04
mov al,[rsi]
cmp al,39H
jbe A2
sub al,07H
A2: sub al,30H
add bl,al
inc rsi
loop up1
ret
hToA:
d: rol ebx,4
mov ax,bx
and ax,0fH
cmp ax,09H
jbe ii
add ax,07H
ii: add ax,30H
mov [rdi],ax
inc rdi
loop d
ret
OUTPUT:
$ nasm -f elf64 ass9_rec.asm
$ ld -o ass9_rec ass9_rec.o
$ ./ass9_rec 02
02
00000002
Download