Added codes.
This commit is contained in:
parent
e2b28eca48
commit
6a5ab32683
88
Codes/Practical-1.asm
Normal file
88
Codes/Practical-1.asm
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to count number of positive and negative numbers from the array.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,1 ; Standard output
|
||||||
|
mov rdi,1 ; Input write
|
||||||
|
mov rsi,%1 ; Display message address
|
||||||
|
mov rdx,%2 ; Message length
|
||||||
|
syscall ; Interrupt for kernel in 64-bit
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
|
||||||
|
m1 db 10,"ALP to count positive and negative numbers from an array",10
|
||||||
|
l1 equ $-m1
|
||||||
|
|
||||||
|
m2 db 10,"The count of positive numbers is:",10
|
||||||
|
l2 equ $-m2
|
||||||
|
|
||||||
|
m3 db 10,"The count of negative numbers is:",10
|
||||||
|
l3 equ $-m3
|
||||||
|
|
||||||
|
;array dw 8132h,6879h,711Ah,3567h,4567h
|
||||||
|
;array dd 81328132h,12346879h,6735711Ah,34563567h,67894567h
|
||||||
|
array dq 81328132ABCDh,12346879AAAAh,6735711AFFFFh,34563567EEEEh,67894567DEFAh
|
||||||
|
|
||||||
|
newline db 10
|
||||||
|
pcnt db 00
|
||||||
|
ncnt db 00
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
displaybuffer resb 2
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
global _start:
|
||||||
|
_start:
|
||||||
|
|
||||||
|
print m1,l1
|
||||||
|
|
||||||
|
mov rsi,array
|
||||||
|
mov rcx,05
|
||||||
|
|
||||||
|
up:
|
||||||
|
bt qword [rsi],63 ; Check the most significant bit for negativity
|
||||||
|
jnc pnxt ; If not negative, jump to pnxt
|
||||||
|
inc byte[ncnt] ; Increment negative count
|
||||||
|
jmp pskip ; Jump to pskip
|
||||||
|
pnxt: inc byte[pcnt] ; Increment positive count
|
||||||
|
pskip: add rsi,8 ; Move to next 8 bytes
|
||||||
|
loop up ; Loop until rcx becomes zero
|
||||||
|
|
||||||
|
print m2,l2
|
||||||
|
mov bl,[pcnt]
|
||||||
|
call display
|
||||||
|
print newline,1
|
||||||
|
|
||||||
|
print m3,l3
|
||||||
|
mov bl,[ncnt]
|
||||||
|
call display
|
||||||
|
print newline,1
|
||||||
|
|
||||||
|
mov rax,60
|
||||||
|
syscall
|
||||||
|
|
||||||
|
display:
|
||||||
|
mov rdi,displaybuffer ; Destination for displaying
|
||||||
|
mov rcx,02 ; Display 2 characters
|
||||||
|
dloop:
|
||||||
|
rol bl,04 ; Rotate left by 4 bits
|
||||||
|
mov dl,bl ; Move contents of bl to dl
|
||||||
|
and dl,0fh ; Mask out upper bits
|
||||||
|
add dl,30h ; Convert to ASCII
|
||||||
|
cmp dl,39h ; Compare if greater than '9'
|
||||||
|
jbe skip ; Jump if below or equal
|
||||||
|
add dl,07h ; Adjust for letters
|
||||||
|
skip:
|
||||||
|
mov [rdi],dl ; Store the character
|
||||||
|
inc rdi ; Move to next position
|
||||||
|
loop dloop ; Loop until rcx becomes zero
|
||||||
|
print displaybuffer,2 ; Print the display buffer
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
145
Codes/Practical-10.asm
Normal file
145
Codes/Practical-10.asm
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
; THIS CODE HAS NOT BEEN TESTED AND IS NOT FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to switch from real mode to protected mode and display the values of GDTR, LDTR, IDTR, TR and MSW Registers also identify CPU type using CPUID instruction.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
section .data
|
||||||
|
rmodemsg db 10,'Processor is in REAL MODE.',
|
||||||
|
rmsg_len:equ $-rmodemsg
|
||||||
|
|
||||||
|
pmodemsg db 10,'Processor is in PROTECTED MODE.'
|
||||||
|
pmsg_len:equ $-pmodemsg
|
||||||
|
|
||||||
|
gdtmsg db 10,'GDT Contents are: '
|
||||||
|
gmsg_len:equ $-gdtmsg
|
||||||
|
|
||||||
|
ldtmsg db 10,'LDT Contents are: '
|
||||||
|
lmsg_len:equ $-ldtmsg
|
||||||
|
|
||||||
|
idtmsg db 10,'IDT Contents are: '
|
||||||
|
imsg_len:equ $-idtmsg
|
||||||
|
|
||||||
|
trmsg db 10,'Task Register Contents are: '
|
||||||
|
tmsg_len: equ $-trmsg
|
||||||
|
|
||||||
|
mswmsg db 10,'Machine Status Word: '
|
||||||
|
mmsg_len:equ $-mswmsg
|
||||||
|
|
||||||
|
colmsg db ':'
|
||||||
|
|
||||||
|
nwline db 10
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
gdt resd 1
|
||||||
|
resw 1
|
||||||
|
ldt resw 1
|
||||||
|
idt resd 1
|
||||||
|
resw 1
|
||||||
|
tr resw 1
|
||||||
|
|
||||||
|
cr0_data resd 1
|
||||||
|
|
||||||
|
dnum_buff resb 04
|
||||||
|
|
||||||
|
%macro print 2
|
||||||
|
mov rax,01
|
||||||
|
mov rdi,01
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
smsw eax ;Reading CR0. As MSW is 32-bit cannot use RAX register.
|
||||||
|
|
||||||
|
mov [cr0_data],rax
|
||||||
|
|
||||||
|
bt rax,0 ;Checking PE bit, if 1=Protected Mode, else Real Mode
|
||||||
|
jc prmode
|
||||||
|
print rmodemsg,rmsg_len
|
||||||
|
jmp nxt1
|
||||||
|
|
||||||
|
prmode: print pmodemsg,pmsg_len
|
||||||
|
|
||||||
|
nxt1:sgdt [gdt]
|
||||||
|
sldt [ldt]
|
||||||
|
sidt [idt]
|
||||||
|
str [tr]
|
||||||
|
print gdtmsg,gmsg_len
|
||||||
|
|
||||||
|
mov bx,[gdt+4]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
mov bx,[gdt+2]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print colmsg,1
|
||||||
|
|
||||||
|
mov bx,[gdt]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print ldtmsg,lmsg_len
|
||||||
|
mov bx,[ldt]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print idtmsg,imsg_len
|
||||||
|
|
||||||
|
mov bx,[idt+4]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
mov bx,[idt+2]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print colmsg,1
|
||||||
|
|
||||||
|
mov bx,[idt]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print trmsg,tmsg_len
|
||||||
|
|
||||||
|
mov bx,[tr]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print mswmsg,mmsg_len
|
||||||
|
|
||||||
|
mov bx,[cr0_data+2]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
mov bx,[cr0_data]
|
||||||
|
call print_num
|
||||||
|
|
||||||
|
print nwline,1
|
||||||
|
|
||||||
|
|
||||||
|
exit: mov rax,60
|
||||||
|
xor rdi,rdi
|
||||||
|
syscall
|
||||||
|
|
||||||
|
print_num:
|
||||||
|
mov rsi,dnum_buff ;point esi to buffer
|
||||||
|
|
||||||
|
mov rcx,04 ;load number of digits to printlay
|
||||||
|
|
||||||
|
up1:
|
||||||
|
rol bx,4 ;rotate number left by four bits
|
||||||
|
mov dl,bl ;move lower byte in dl
|
||||||
|
and dl,0fh ;mask upper digit of byte in dl
|
||||||
|
add dl,30h ;add 30h to calculate ASCII code
|
||||||
|
cmp dl,39h ;compare with 39h
|
||||||
|
jbe skip1 ;if less than 39h skip adding 07 more
|
||||||
|
add dl,07h ;else add 07
|
||||||
|
skip1:
|
||||||
|
mov [rsi],dl ;store ASCII code in buffer
|
||||||
|
inc rsi ;point to next byte
|
||||||
|
loop up1 ;decrement the count of digits to printlay
|
||||||
|
;if not zero jump to repeat
|
||||||
|
|
||||||
|
print dnum_buff,4 ;printlay the number from buffer
|
||||||
|
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
130
Codes/Practical-11.asm
Normal file
130
Codes/Practical-11.asm
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
; THIS CODE HAS NOT BEEN TESTED AND IS NOT FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write x86 ALP to find the factorial of a given integer number on a command line by using recursion. Explicit stack manipulation is expected in the code.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,1
|
||||||
|
mov rdi,1
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro exitprog 0
|
||||||
|
mov rax,60
|
||||||
|
xor rdi,rdi
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro gtch 1
|
||||||
|
mov rax,0
|
||||||
|
mov rdi,0
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,1
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
nwline db 10
|
||||||
|
m0 db 10,13,"----- Program to calculate factorial of a given number -----",10,10
|
||||||
|
l0 equ $-m0
|
||||||
|
m2 db 10,"Enter a number (2 digit HEX no.): "
|
||||||
|
l2 equ $-m2
|
||||||
|
m4 db 10,"The factorial is: "
|
||||||
|
l4 equ $-m4
|
||||||
|
factorial dq 1
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
no1 resq 1
|
||||||
|
input resb 1
|
||||||
|
output resb 1
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
|
||||||
|
print m0,l0
|
||||||
|
print m2,l2
|
||||||
|
call getnum
|
||||||
|
|
||||||
|
mov [no1],rax ;accept number
|
||||||
|
gtch input ;to read and discard ENTER key ;pressed
|
||||||
|
|
||||||
|
mov rcx,[no1]
|
||||||
|
|
||||||
|
call facto
|
||||||
|
mov rax,00
|
||||||
|
|
||||||
|
print m4,l4
|
||||||
|
mov rax,qword[factorial]
|
||||||
|
call disphx16 ;displays a 8 digit hex number ;in rax
|
||||||
|
|
||||||
|
exitprog
|
||||||
|
|
||||||
|
facto:
|
||||||
|
push rcx
|
||||||
|
cmp rcx,01
|
||||||
|
jne ahead
|
||||||
|
jmp exit2
|
||||||
|
|
||||||
|
ahead: dec rcx
|
||||||
|
|
||||||
|
call facto
|
||||||
|
|
||||||
|
exit2:
|
||||||
|
pop rcx
|
||||||
|
mov rax,rcx
|
||||||
|
mul qword[factorial]
|
||||||
|
mov qword[factorial],rax
|
||||||
|
ret
|
||||||
|
;Procedure to get a 2 digit hex no from user
|
||||||
|
;number returned in rax
|
||||||
|
|
||||||
|
getnum:
|
||||||
|
mov cx,0204h
|
||||||
|
mov rbx,0
|
||||||
|
ll2:
|
||||||
|
push rcx
|
||||||
|
gtch input
|
||||||
|
pop rcx
|
||||||
|
mov rax,0
|
||||||
|
mov al,byte[input]
|
||||||
|
sub rax,30h
|
||||||
|
cmp rax,09h
|
||||||
|
jbe skip1
|
||||||
|
sub rax,7
|
||||||
|
|
||||||
|
skip1:
|
||||||
|
shl rbx,cl
|
||||||
|
add rbx,rax
|
||||||
|
dec ch
|
||||||
|
jnz ll2
|
||||||
|
mov rax,rbx
|
||||||
|
ret
|
||||||
|
|
||||||
|
disphx16: ;displays a 16 digit hex number
|
||||||
|
mov rbx,rax
|
||||||
|
mov cx,1004h ;16 digits to display and 04 count ; to rotate
|
||||||
|
|
||||||
|
ll6:
|
||||||
|
rol rbx,cl
|
||||||
|
mov rdx,rbx
|
||||||
|
and rdx,0fh
|
||||||
|
add rdx,30h
|
||||||
|
cmp rdx,039h
|
||||||
|
jbe skip4
|
||||||
|
add rdx,7
|
||||||
|
|
||||||
|
skip4:
|
||||||
|
mov byte[output],dl
|
||||||
|
push rcx
|
||||||
|
print output,1
|
||||||
|
pop rcx
|
||||||
|
dec ch
|
||||||
|
jnz ll6
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
176
Codes/Practical-12.asm
Normal file
176
Codes/Practical-12.asm
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
; THIS CODE HAS NOT BEEN TESTED AND IS NOT FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write 80387 ALP to obtain: i) Mean ii) Variance iii) Standard Deviation. Define the input values in data segment.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,01
|
||||||
|
mov rdi,01
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
|
||||||
|
section .data
|
||||||
|
m0 db 10,"------ Program to calculate mean, variance, standard deviation -----", 10
|
||||||
|
l0:equ $-m0
|
||||||
|
|
||||||
|
m1 db 10,"Mean is: "
|
||||||
|
l1:equ $-m1
|
||||||
|
|
||||||
|
m2 db 10,"Variance is: "
|
||||||
|
l2:equ $-m2
|
||||||
|
|
||||||
|
m3 db 10,"Standard Deviation is: "
|
||||||
|
l3:equ $-m3
|
||||||
|
|
||||||
|
m4 db 10,"Values are: 102.59, 198.21, 100.67"
|
||||||
|
l4:equ $-m4
|
||||||
|
|
||||||
|
dpoint db "."
|
||||||
|
|
||||||
|
hdec dq 100
|
||||||
|
|
||||||
|
num1 dd 102.59
|
||||||
|
num2 dd 198.21
|
||||||
|
num3 dd 100.67
|
||||||
|
num4 dd 3.00
|
||||||
|
|
||||||
|
newline db 0xa
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
|
||||||
|
dispbuff resb 1
|
||||||
|
resbuff resb 10 ;or we can also write resbuff rest 1
|
||||||
|
mean resd 1
|
||||||
|
variance resd 1
|
||||||
|
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
print m0,l0
|
||||||
|
print m4,l4
|
||||||
|
|
||||||
|
finit ;initialize coprocessor
|
||||||
|
fldz ;load stack top 0
|
||||||
|
|
||||||
|
;logic to calculate mean
|
||||||
|
|
||||||
|
fld dword[num1] ;first number on x387
|
||||||
|
fld dword[num2]
|
||||||
|
|
||||||
|
fadd st0,st1
|
||||||
|
|
||||||
|
fld dword[num3]
|
||||||
|
fadd st0,st1
|
||||||
|
|
||||||
|
fdiv dword[num4] ;st0=add/3=mean
|
||||||
|
fst dword[mean]
|
||||||
|
|
||||||
|
print m1,l1
|
||||||
|
|
||||||
|
call disp_result
|
||||||
|
|
||||||
|
print newline,01 ;newline
|
||||||
|
|
||||||
|
;logic to calculate variance
|
||||||
|
|
||||||
|
mov rsi,num1
|
||||||
|
call cal_diff_sqr
|
||||||
|
|
||||||
|
mov rsi,num2
|
||||||
|
call cal_diff_sqr
|
||||||
|
|
||||||
|
fadd st0,st1
|
||||||
|
|
||||||
|
mov rsi,num3
|
||||||
|
call cal_diff_sqr
|
||||||
|
|
||||||
|
fadd st0,st1
|
||||||
|
|
||||||
|
fdiv dword[num4] ;divide by cardinality
|
||||||
|
|
||||||
|
fst dword[variance]
|
||||||
|
|
||||||
|
print m2,l2
|
||||||
|
|
||||||
|
call disp_result
|
||||||
|
|
||||||
|
print newline,01 ;newline
|
||||||
|
|
||||||
|
;logic to calculate standard deviation
|
||||||
|
|
||||||
|
fld dword[variance]
|
||||||
|
fsqrt
|
||||||
|
|
||||||
|
print m3,l3
|
||||||
|
call disp_result
|
||||||
|
|
||||||
|
print newline,01 ;newline
|
||||||
|
|
||||||
|
mov rax,60
|
||||||
|
mov rdi,0
|
||||||
|
syscall
|
||||||
|
|
||||||
|
disp_result:
|
||||||
|
fimul dword[hdec]
|
||||||
|
fbstp [resbuff] ;store bcd and pop from top of the stack
|
||||||
|
|
||||||
|
xor rcx,rcx ;clear rcx register
|
||||||
|
mov rcx,09h
|
||||||
|
mov rsi,resbuff+9 ;rsi pointing to msb of resultant
|
||||||
|
|
||||||
|
up1:
|
||||||
|
push rcx
|
||||||
|
push rsi
|
||||||
|
|
||||||
|
mov bl,[rsi]
|
||||||
|
call disp8_proc
|
||||||
|
|
||||||
|
print dispbuff,02
|
||||||
|
pop rsi
|
||||||
|
dec rsi
|
||||||
|
pop rcx
|
||||||
|
loop up1
|
||||||
|
|
||||||
|
print dpoint,01
|
||||||
|
|
||||||
|
mov bl,[resbuff]
|
||||||
|
call disp8_proc
|
||||||
|
|
||||||
|
print dispbuff,02
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
disp8_proc:
|
||||||
|
mov rdi,dispbuff
|
||||||
|
mov rcx,02
|
||||||
|
|
||||||
|
back:
|
||||||
|
rol bl,04
|
||||||
|
mov dl,bl
|
||||||
|
and dl,0Fh
|
||||||
|
cmp dl,09h
|
||||||
|
jbe skip
|
||||||
|
add dl,07h
|
||||||
|
|
||||||
|
skip:
|
||||||
|
add dl,30h
|
||||||
|
mov [rdi],dl
|
||||||
|
inc rdi
|
||||||
|
loop back
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
cal_diff_sqr:
|
||||||
|
fld dword[rsi]
|
||||||
|
fsub dword[mean]
|
||||||
|
fmul st0,st0
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
153
Codes/Practical-13.asm
Normal file
153
Codes/Practical-13.asm
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write 80387 ALP to find the roots of the quadratic equation. All the possible cases must be considered in calculating the roots.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
section .data
|
||||||
|
msg1 db "Complex Root",10
|
||||||
|
msglen1 equ $-msg1
|
||||||
|
msg2 db "Root 1: "
|
||||||
|
msglen2 equ $-msg2
|
||||||
|
msg3 db 10, "Root 2: "
|
||||||
|
msglen3 equ $-msg3
|
||||||
|
a dd 1.00
|
||||||
|
b dd -6.00
|
||||||
|
c dd 8.00
|
||||||
|
four dd 4.00
|
||||||
|
two dd 2.00
|
||||||
|
|
||||||
|
hdec dq 100
|
||||||
|
point db "."
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
|
||||||
|
root1 resd 1
|
||||||
|
root2 resd 1
|
||||||
|
resbuff rest 1
|
||||||
|
temp resb 2
|
||||||
|
disc resd 1
|
||||||
|
|
||||||
|
%macro write 2 ;macro for display
|
||||||
|
mov rax,1
|
||||||
|
mov rdi,1
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro read 2 ;macro for input
|
||||||
|
mov rax,0
|
||||||
|
mov rdi,0
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
|
||||||
|
%macro exit 0 ;macro for exit
|
||||||
|
mov rax,60
|
||||||
|
xor rdi,rdi
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
|
||||||
|
finit ;initialise 80387 co-processor
|
||||||
|
fld dword[b] ;stack: b
|
||||||
|
|
||||||
|
fmul dword[b] ;stack: b*b
|
||||||
|
|
||||||
|
fld dword[a] ;stack: a, b*b
|
||||||
|
|
||||||
|
fmul dword[c] ;stack: a*c, b*b
|
||||||
|
|
||||||
|
fmul dword[four] ;stack: 4*a*c,b*b
|
||||||
|
|
||||||
|
fsub ;stack: b*b - 4*a*c
|
||||||
|
|
||||||
|
ftst ;compares ST0 and 0
|
||||||
|
jb no_real_solutions
|
||||||
|
|
||||||
|
fsqrt ;stack: sqrt(b*b - 4*a*c)
|
||||||
|
fst dword[disc] ;store disc= sqrt(b*b - 4*a*c)
|
||||||
|
|
||||||
|
fsub dword[b] ;stack: disc-b
|
||||||
|
|
||||||
|
fdiv dword[a] ;stack: disc-b/2*a or (-b+disc)/2a
|
||||||
|
|
||||||
|
|
||||||
|
fdiv dword[two]
|
||||||
|
|
||||||
|
write msg2,msglen2
|
||||||
|
|
||||||
|
call disp_proc
|
||||||
|
|
||||||
|
fldz ;stack:0
|
||||||
|
fsub dword[disc] ;stack:-disc
|
||||||
|
fsub dword[b] ;stack: -disc - b
|
||||||
|
fdiv dword[a] ;stack: (-b - disc)/(2*a)
|
||||||
|
fdiv dword[two]
|
||||||
|
|
||||||
|
write msg3,msglen3
|
||||||
|
call disp_proc
|
||||||
|
jmp exi
|
||||||
|
|
||||||
|
no_real_solutions:
|
||||||
|
write msg1,msglen1
|
||||||
|
exi :
|
||||||
|
|
||||||
|
mov rax,60
|
||||||
|
mov rdi,1
|
||||||
|
syscall
|
||||||
|
|
||||||
|
|
||||||
|
disp_proc:
|
||||||
|
FIMUL dword[hdec]
|
||||||
|
FBSTP tword[resbuff]
|
||||||
|
mov rsi,resbuff+9
|
||||||
|
mov rcx,09
|
||||||
|
next1:
|
||||||
|
|
||||||
|
push rcx
|
||||||
|
push rsi
|
||||||
|
|
||||||
|
mov bl,[rsi]
|
||||||
|
call disp
|
||||||
|
|
||||||
|
pop rsi
|
||||||
|
pop rcx
|
||||||
|
|
||||||
|
dec rsi
|
||||||
|
loop next1
|
||||||
|
|
||||||
|
push rsi
|
||||||
|
write point,1
|
||||||
|
pop rsi
|
||||||
|
mov bl,[rsi]
|
||||||
|
call disp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
disp:
|
||||||
|
mov rdi,temp ;mov dnum address into edi
|
||||||
|
mov rcx,02 ;initialize ecx with 2
|
||||||
|
dispup1:
|
||||||
|
rol bl,4 ;rotate bl by 4 bits
|
||||||
|
mov dl,bl ;move bl into dl
|
||||||
|
and dl,0fh ;and of dl with 0fh
|
||||||
|
add dl,30h ;add 30h into dl
|
||||||
|
cmp dl,39h ;compare dl with 39h
|
||||||
|
jbe dispskip1 ;jump if below and equal to dispskip1
|
||||||
|
add dl,07h ;add 7h into dl
|
||||||
|
dispskip1:
|
||||||
|
mov [rdi],dl ;mov dl into dnum
|
||||||
|
inc rdi ;increament edi by a byte
|
||||||
|
loop dispup1 ;loop dispup1 while ecx not zero
|
||||||
|
write temp,2 ;Display dnum by calling macro
|
||||||
|
ret ;return from procedure
|
||||||
|
; END OF CODE
|
94
Codes/Practical-3.1 (with string).asm
Normal file
94
Codes/Practical-3.1 (with string).asm
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to perform non-overlapped block transfer (WITH string specific instructions). Block containing data can be defined in the data segment.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,1 ; Standard output
|
||||||
|
mov rdi,1 ; Input write
|
||||||
|
mov rsi,%1 ; Display message address
|
||||||
|
mov rdx,%2 ; Message length
|
||||||
|
syscall ; Interrupt for kernel in 64-bit
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
msg db 10, 'Block contents before transfer',10,13 ; Initializing the display message
|
||||||
|
msglen equ $-msg ; Length of the message
|
||||||
|
|
||||||
|
msg2 db 10, 'Block contents after transfer',10,13 ; Initializing the display message
|
||||||
|
msg2len equ $-msg2 ; Length of the message
|
||||||
|
|
||||||
|
msg3 db 10,13, 'Source block'
|
||||||
|
msg3len equ $-msg3
|
||||||
|
|
||||||
|
msg4 db 10,13, 'Destination block'
|
||||||
|
msg4len equ $-msg4
|
||||||
|
|
||||||
|
space db ' ' ; Space between the variables to be displayed
|
||||||
|
spacelen equ $-space ; Initializing length of space
|
||||||
|
|
||||||
|
srcblk db 10h,20h,30h,40h,50h ; Contents of the src block
|
||||||
|
destblk db 0,0,0,0,0 ; Initial contents of dest block
|
||||||
|
cnt equ 5 ; Count is equal to 5 as 5 variables declared
|
||||||
|
|
||||||
|
section .bss ; Storing the array of data/reserving space for the data
|
||||||
|
ans resb 4 ; Reserve buffer ans of 4-bytes(8-bits each)
|
||||||
|
;destblk resb 5 ; Reserve buffer destblk of 5-bytes
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global _start ; Starting of the main program
|
||||||
|
_start:
|
||||||
|
print msg,msglen ; Displaying the msg1
|
||||||
|
mov rsi,srcblk ; Move contents of source blk to rsi
|
||||||
|
call disp_block ; Calling procedure disp_block
|
||||||
|
cld ; Clear direction flag
|
||||||
|
mov rcx,05h ; Move 05h into rcx register
|
||||||
|
mov rsi,srcblk ; Move contents of src block into rsi
|
||||||
|
mov rdi,destblk ; Move contents of dest blok into rdi
|
||||||
|
rep movsb ; Repeat move string byte
|
||||||
|
|
||||||
|
print msg2,msg2len ; Displaying the msg2
|
||||||
|
mov rsi,destblk ; Move contents of destblk into rsi
|
||||||
|
call disp_block ; Calling procedure disp_block
|
||||||
|
mov rax,60 ; Exit system call
|
||||||
|
xor rdi,rdi ; Clearing rdi (by using xor) so that we get 0 in destblk
|
||||||
|
syscall ; Interrupt for kernel in 64-bit
|
||||||
|
|
||||||
|
disp_block: ; Procedure disp_block
|
||||||
|
mov rbp,cnt ; Base pointers
|
||||||
|
|
||||||
|
back:
|
||||||
|
mov al,[rsi] ; Move contents of rsi to al
|
||||||
|
push rsi ; Push contents of rsi
|
||||||
|
call disp_8 ; Calling the disp_8 procedure
|
||||||
|
print space,1 ; Intialize one byte for space
|
||||||
|
pop rsi ; Pop contents of rsi
|
||||||
|
inc rsi ; Increment rsi by 1
|
||||||
|
dec rbp ; Decrement cnt through rbp
|
||||||
|
jnz back ; Jump to loop back if not zero
|
||||||
|
ret ; Return
|
||||||
|
|
||||||
|
disp_8: ; Procedure disp_8
|
||||||
|
mov rsi,ans+1 ; Move the contents of ans buffer into rsi
|
||||||
|
mov rcx,2 ; Move 2 into the rcx register
|
||||||
|
|
||||||
|
back1: ; Loop back1
|
||||||
|
mov rdx,0 ; Clear rdx
|
||||||
|
mov rbx,16 ; Move 16 into rbx register
|
||||||
|
div rbx ; Divide rax register by rbx register
|
||||||
|
cmp dl,09h ; Compare the contents of dl register with 09h
|
||||||
|
jbe add_30 ; If compared value is below (less) than add 30h
|
||||||
|
add dl ,07h ; Add 07h to dl register
|
||||||
|
|
||||||
|
add_30: ; add_30 label
|
||||||
|
add dl,30h ; Add 30h to the contents of dl register
|
||||||
|
mov[rsi],dl ; Move contents of dl into rsi
|
||||||
|
dec rsi ; Decrement rsi
|
||||||
|
dec rcx ; Decrement rcx
|
||||||
|
jnz back1 ; Jump if not zero to loop back1
|
||||||
|
print ans,2 ; Print the result
|
||||||
|
ret ; Return
|
||||||
|
; END OF CODE
|
101
Codes/Practical-3.2 (without string).asm
Normal file
101
Codes/Practical-3.2 (without string).asm
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to perform non-overlapped block transfer (WITHOUT string specific instructions). Block containing data can be defined in the data segment.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,1
|
||||||
|
mov rdi,1
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
m1 db 10,"Source block:",10,13
|
||||||
|
m1len equ $-m1
|
||||||
|
|
||||||
|
m2 db 10,"Destination block after transfer:",10,13
|
||||||
|
m2len equ $-m2
|
||||||
|
|
||||||
|
space db" "
|
||||||
|
spacelen equ $-space
|
||||||
|
|
||||||
|
srcblk db 10h,20h,30h,40h,50h
|
||||||
|
|
||||||
|
count equ 05h
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
ans resb 4
|
||||||
|
dstblk resb 5
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
print m1,m1len
|
||||||
|
mov rsi,srcblk
|
||||||
|
call disp_block
|
||||||
|
|
||||||
|
print m2,m2len
|
||||||
|
|
||||||
|
mov rsi,srcblk
|
||||||
|
mov rdi,dstblk
|
||||||
|
mov rcx,05
|
||||||
|
|
||||||
|
s1: mov al,[rsi]
|
||||||
|
mov [rdi],al
|
||||||
|
inc rsi
|
||||||
|
inc rdi
|
||||||
|
loop s1
|
||||||
|
|
||||||
|
mov rsi,dstblk
|
||||||
|
call disp_block
|
||||||
|
|
||||||
|
mov rax,60
|
||||||
|
xor rdi,rdi
|
||||||
|
syscall
|
||||||
|
|
||||||
|
disp_block:
|
||||||
|
mov rbp,count
|
||||||
|
back:mov al,[rsi]
|
||||||
|
push rsi
|
||||||
|
call disp_8
|
||||||
|
print space,1
|
||||||
|
pop rsi
|
||||||
|
inc rsi
|
||||||
|
dec rbp
|
||||||
|
jnz back
|
||||||
|
ret
|
||||||
|
|
||||||
|
disp_8:mov rsi,ans
|
||||||
|
|
||||||
|
mov bl,al
|
||||||
|
mov dl,bl
|
||||||
|
rol dl,04
|
||||||
|
and dl,0fh
|
||||||
|
cmp dl,09h
|
||||||
|
jbe add30
|
||||||
|
add dl,07h
|
||||||
|
|
||||||
|
add30:
|
||||||
|
add dl,30h
|
||||||
|
mov [rsi],dl
|
||||||
|
inc rsi
|
||||||
|
|
||||||
|
mov dl,bl
|
||||||
|
and dl,0fh
|
||||||
|
cmp dl,09h
|
||||||
|
jbe add130
|
||||||
|
add dl,07h
|
||||||
|
|
||||||
|
add130:
|
||||||
|
|
||||||
|
add dl,30h
|
||||||
|
mov [rsi],dl
|
||||||
|
|
||||||
|
print ans,2
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
85
Codes/Practical-4.1 (with string).asm
Normal file
85
Codes/Practical-4.1 (with string).asm
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to perform overlapped block transfer (WITH string specific instructions). Block containing data can be defined in the data segment.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,1
|
||||||
|
mov rdi,1
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
msg1 db 10,"src blk",10,13 ; Initializing the display message
|
||||||
|
msg1len equ $-msg1 ; Initializing the length of message
|
||||||
|
msg2 db 10,"dest blk",10,13
|
||||||
|
msg2len equ $-msg2
|
||||||
|
srcblk db 10h,20h,30h,40h,50h ; Storing variables in source block
|
||||||
|
cnt equ 05h ; Count is equal to 5 as 5 variables declared
|
||||||
|
space db " " ; Space between the variables to be displayed
|
||||||
|
spacelen equ $-space ; Initializing length of space
|
||||||
|
|
||||||
|
section .bss ; Storing the array of data/reserving space for the data
|
||||||
|
ans resb 4 ; Reserve buffer ans of 4-bytes(8-bits each)
|
||||||
|
destblk resb 5 ; Reserve buffer destblk of 5-bytes
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global _start ; Starting of the main program
|
||||||
|
_start:
|
||||||
|
print msg1,msg1len ; Displaying the msg1
|
||||||
|
mov rsi,srcblk ; Move contents of source blk to rsi
|
||||||
|
call disp_block ; Calling procedure disp_block
|
||||||
|
cld ; Clear direction flag
|
||||||
|
mov rcx,02h ; Move 02h into rcx register
|
||||||
|
mov rsi,srcblk ; Move contents of the source blk to the rsi
|
||||||
|
mov rdi,destblk ; Shift 2 positions in the source blk and move the contents into rdi
|
||||||
|
rep movsb ; Repeat move string byte
|
||||||
|
mov rcx,03h ; Move 02h into rcx register
|
||||||
|
mov rsi,srcblk ; Move contents of the source blk to the rsi
|
||||||
|
mov rdi,destblk+2
|
||||||
|
rep movsb
|
||||||
|
print msg2,msg2len ; Displaying the msg2
|
||||||
|
mov rsi,destblk ; Move contents of destblk into rsi
|
||||||
|
call disp_block ; Calling procedure disp_block
|
||||||
|
mov rax,60 ; Exit system call
|
||||||
|
xor rdi,rdi ; Clearing rdi (by using xor) so that we get 0 in destblk
|
||||||
|
syscall ; Interrupt for kernel in 64-bit
|
||||||
|
disp_block: ; Procedure disp_block
|
||||||
|
mov rbp,cnt ; Base pointers
|
||||||
|
back:
|
||||||
|
mov al,[rsi] ; Move contents of rsi to al
|
||||||
|
push rsi ; Push contents of rsi
|
||||||
|
call disp_8 ; Calling the disp_8 procedure
|
||||||
|
print space,1 ; Initialize one byte for space
|
||||||
|
pop rsi ; Pop contents of rsi
|
||||||
|
inc rsi ; Increment rsi by 1
|
||||||
|
dec rbp ; Decrement cnt through rbp
|
||||||
|
jnz back ; Jump to loop back if not zero
|
||||||
|
ret ; Return
|
||||||
|
|
||||||
|
disp_8: ; Procedure disp_8
|
||||||
|
mov rsi,ans+1 ; Move the contents of ans buffer into rsi
|
||||||
|
mov rcx,2 ; Move 2 into the rcx register
|
||||||
|
|
||||||
|
back1: ; Loop back1
|
||||||
|
mov rdx,0 ; Clear rdx
|
||||||
|
mov rbx,16 ; Move 16 into rbx register
|
||||||
|
div rbx ; Divide rax register by rbx register
|
||||||
|
cmp dl,09h ; Compare the contents of dl register with 09h
|
||||||
|
jbe add_30 ; If compared value is below (less) than add 30h
|
||||||
|
add dl ,07h ; Add 07h to dl register
|
||||||
|
|
||||||
|
add_30: ; Add_30 label
|
||||||
|
add dl,30h ; Add 30h to the contents of dl register
|
||||||
|
mov[rsi],dl ; Move contents of dl into rsi
|
||||||
|
dec rsi ; Decrement rsi
|
||||||
|
dec rcx ; Decrement rcx
|
||||||
|
jnz back1 ; Jump if not zero to loop back1
|
||||||
|
print ans,2 ; Print the result
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
110
Codes/Practical-4.2 (without string).asm
Normal file
110
Codes/Practical-4.2 (without string).asm
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to perform overlapped block transfer (WITHOUT string specific instructions). Block containing data can be defined in the data segment.
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2 ; Defined macro for printing messages 2 stand for the parameters
|
||||||
|
mov rax,1 ; For system write specifier
|
||||||
|
mov rdi,1 ; Standard output
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
m1 db 10,"source block",10,13 ; 10 stands for new line and 13 stands for tab
|
||||||
|
m1len equ $-m1
|
||||||
|
|
||||||
|
m2 db 10,"destination block after transfer:",10,13
|
||||||
|
m2len equ $-m2
|
||||||
|
|
||||||
|
space db " "
|
||||||
|
spacelen equ $-space
|
||||||
|
|
||||||
|
srcblk db 10h,20h,30h,40h,50h ; srcblk defined for the functioning
|
||||||
|
count equ 05h ; count initialized to 5
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
ans resb 4 ; ans block is defined for storing the transformed value of the numbers from hexa to ascii
|
||||||
|
dstblk resb 5 ; dstblk is our destination block
|
||||||
|
|
||||||
|
section .text ; This section is necessary for assembler understanding
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
print m1,m1len
|
||||||
|
mov rsi,srcblk ; rsi now points to the first location of the source block
|
||||||
|
call disp_block ; Calling the procedure for displaying the source block
|
||||||
|
|
||||||
|
print m2,m2len
|
||||||
|
|
||||||
|
mov rsi,srcblk ; Now the rsi points to the source block
|
||||||
|
mov rdi,dstblk ; Now the destination pointer points to the first memory location of the destination block
|
||||||
|
mov rcx,02 ; rcx is the register used for the counter purpose
|
||||||
|
|
||||||
|
s1: mov al,[rsi]
|
||||||
|
mov [rdi],al
|
||||||
|
inc rsi
|
||||||
|
inc rdi
|
||||||
|
loop s1
|
||||||
|
mov rsi,srcblk
|
||||||
|
mov rcx,03
|
||||||
|
|
||||||
|
s2: mov al,[rsi]
|
||||||
|
mov [rdi],al
|
||||||
|
inc rsi
|
||||||
|
inc rdi
|
||||||
|
loop s2
|
||||||
|
|
||||||
|
mov rsi,dstblk
|
||||||
|
call disp_block
|
||||||
|
|
||||||
|
mov rax,60
|
||||||
|
xor rdi,rdi
|
||||||
|
syscall
|
||||||
|
|
||||||
|
disp_block:
|
||||||
|
mov rbp,count
|
||||||
|
|
||||||
|
back:
|
||||||
|
mov al,[rsi]
|
||||||
|
push rsi
|
||||||
|
call disp_8
|
||||||
|
print space,1
|
||||||
|
pop rsi
|
||||||
|
inc rsi
|
||||||
|
dec rbp
|
||||||
|
jnz back
|
||||||
|
ret
|
||||||
|
|
||||||
|
disp_8:
|
||||||
|
mov rsi,ans
|
||||||
|
|
||||||
|
mov bl,al
|
||||||
|
mov dl,bl
|
||||||
|
rol dl,04
|
||||||
|
and dl,0fh
|
||||||
|
cmp dl,09h
|
||||||
|
jbe add30
|
||||||
|
add dl,07h
|
||||||
|
|
||||||
|
add30:
|
||||||
|
add dl,30h
|
||||||
|
mov [rsi],dl
|
||||||
|
inc rsi
|
||||||
|
|
||||||
|
mov dl,bl
|
||||||
|
and dl,0fh
|
||||||
|
cmp dl,09h
|
||||||
|
jbe add130
|
||||||
|
add dl,07h
|
||||||
|
|
||||||
|
add130:
|
||||||
|
add dl,30h
|
||||||
|
mov [rsi],dl
|
||||||
|
|
||||||
|
print ans,2
|
||||||
|
ret
|
||||||
|
; END OF CODE
|
119
Codes/Practical-5.1 (successive addition).asm
Normal file
119
Codes/Practical-5.1 (successive addition).asm
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
; THIS CODE HAS NOT BEEN TESTED AND IS NOT FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to perform multiplication of two 8-bit hexadecimal numbers. Using successive addition method. (Use of 64-bit registers is expected).
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro print 2
|
||||||
|
mov rax,1
|
||||||
|
mov rdi,1
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro accept 2
|
||||||
|
mov rax,0
|
||||||
|
mov rdi,0
|
||||||
|
mov rsi,%1
|
||||||
|
mov rdx,%2
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .data
|
||||||
|
|
||||||
|
m1 db 10,"----- Multiplication using successive addition -----",10,13
|
||||||
|
l1 equ $-m1
|
||||||
|
|
||||||
|
m2 db 10,"Enter the multiplicand",10,13
|
||||||
|
l2 equ $-m2
|
||||||
|
|
||||||
|
m3 db 10,"Enter the multiplier",10,13
|
||||||
|
l3 equ $-m3
|
||||||
|
|
||||||
|
res db 10,"Multiplication of the numbers is::",10,13
|
||||||
|
rlen equ $-res
|
||||||
|
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
|
||||||
|
numascii resb 03
|
||||||
|
mplier resq 02
|
||||||
|
mcand resq 02
|
||||||
|
;result resq 01
|
||||||
|
dispbuff resb 04
|
||||||
|
|
||||||
|
section .txt
|
||||||
|
global _start:
|
||||||
|
_start:
|
||||||
|
|
||||||
|
print m1,l1
|
||||||
|
|
||||||
|
print m2,l2
|
||||||
|
accept numascii,3
|
||||||
|
call packnum
|
||||||
|
mov byte[mcand],bl
|
||||||
|
|
||||||
|
print m3,l3
|
||||||
|
accept numascii,3
|
||||||
|
call packnum
|
||||||
|
mov byte[mplier],bl
|
||||||
|
|
||||||
|
print res,rlen
|
||||||
|
|
||||||
|
mov rax,0
|
||||||
|
cmp qword[mplier],0
|
||||||
|
jz ll5
|
||||||
|
|
||||||
|
ll1:
|
||||||
|
add rax,qword[mcand]
|
||||||
|
dec qword[mplier]
|
||||||
|
jnz ll1
|
||||||
|
|
||||||
|
ll5:
|
||||||
|
call dispnum
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mov rax,60
|
||||||
|
mov rbx,00
|
||||||
|
syscall
|
||||||
|
|
||||||
|
|
||||||
|
dispnum:
|
||||||
|
mov rbx,rax
|
||||||
|
mov rcx,04
|
||||||
|
mov rdi,dispbuff
|
||||||
|
up2:
|
||||||
|
rol bx,4
|
||||||
|
mov al,bl
|
||||||
|
and al,0fh
|
||||||
|
cmp al,09
|
||||||
|
jbe dskip
|
||||||
|
add al,07h
|
||||||
|
dskip:
|
||||||
|
add al,30h
|
||||||
|
mov [rdi],al
|
||||||
|
inc rdi
|
||||||
|
loop up2
|
||||||
|
print dispbuff,4
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
packnum:
|
||||||
|
mov bl,0
|
||||||
|
mov rcx,2
|
||||||
|
mov rsi,numascii
|
||||||
|
up1:
|
||||||
|
rol bl,04
|
||||||
|
mov al,[rsi]
|
||||||
|
cmp al,39h
|
||||||
|
jbe skip1
|
||||||
|
sub al,07h
|
||||||
|
skip1:
|
||||||
|
sub al,30h
|
||||||
|
add bl,al
|
||||||
|
inc rsi
|
||||||
|
loop up1
|
||||||
|
ret
|
186
Codes/Practical-5.2 (add and shift method).asm
Normal file
186
Codes/Practical-5.2 (add and shift method).asm
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
; THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||||
|
|
||||||
|
; Problem Statement: Write X86/64 ALP to perform multiplication of two 8-bit hexadecimal numbers. Using add and shift method. (Use of 64-bit registers is expected).
|
||||||
|
|
||||||
|
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
|
||||||
|
|
||||||
|
|
||||||
|
; BEGINNING OF CODE
|
||||||
|
%macro dispmsg 2 ;macro for display
|
||||||
|
mov rax,1 ;standard ouput
|
||||||
|
mov rdi,1 ;system for write
|
||||||
|
mov rsi,%1 ;display message address
|
||||||
|
mov rdx,%2 ;display message length
|
||||||
|
syscall ;interrupt for 64-bit
|
||||||
|
%endmacro ;close macro
|
||||||
|
|
||||||
|
%macro exitprog 0 ;macro for exit
|
||||||
|
mov rax,60 ;system for exit
|
||||||
|
mov rdx,0
|
||||||
|
syscall ;interrupt for 64-bit
|
||||||
|
%endmacro ;close macro
|
||||||
|
|
||||||
|
%macro gtch 1 ;macro for accept
|
||||||
|
mov rax,0 ;standard input
|
||||||
|
mov rdi,0 ;system for read
|
||||||
|
mov rsi,%1 ;input the message
|
||||||
|
mov rdx,1 ;message length
|
||||||
|
syscall ;interrupt for 64-bit
|
||||||
|
%endmacro ;close macro
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
section .data
|
||||||
|
nwline db 10
|
||||||
|
m0 db 10,10,"Program to multiply two numbers using successive addition and add-and-shift method"
|
||||||
|
l0 equ $-m0
|
||||||
|
m1 db 10,"1. Add-and-Shift method",10,"2. Exit",10,10, "Choose an option (1/2 <ENTER>): "
|
||||||
|
l1 equ $-m1
|
||||||
|
m2 db 10,"Enter multiplicand (2 digit HEX no): "
|
||||||
|
l2 equ $-m2
|
||||||
|
m3 db 10,"Enter multiplier (2 digit HEX no): "
|
||||||
|
l3 equ $-m3
|
||||||
|
m4 db 10,"Multiplication is: "
|
||||||
|
l4 equ $-m4
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
section .bss
|
||||||
|
mcand resq 1 ;reserve 1 quad for multiplicand
|
||||||
|
mplier resq 1 ;reserve 1 quad for multiplier
|
||||||
|
input resb 1 ;reserve 1 byte for input
|
||||||
|
output resb 1 ;reserve 1 byte for output
|
||||||
|
choice resb 1 ;reserve 1 byte for choice
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
section .text
|
||||||
|
global _start ;starting of main program
|
||||||
|
_start :
|
||||||
|
|
||||||
|
dispmsg m0,l0 ;displaying the menu
|
||||||
|
|
||||||
|
back:
|
||||||
|
dispmsg m1,l1 ;displaying the first message
|
||||||
|
gtch input ;to read and discard ENTER key pressed.
|
||||||
|
|
||||||
|
mov al, byte[input] ;get choice
|
||||||
|
mov byte[choice],al
|
||||||
|
|
||||||
|
gtch input ;to read and discard ENTER key pressed.
|
||||||
|
|
||||||
|
mov al, byte[choice]
|
||||||
|
|
||||||
|
cmp al, '1' ;compare contents of al with 1
|
||||||
|
je shft_add ;if equal the jump to succ_add procedure
|
||||||
|
|
||||||
|
cmp al, '2' ;compare the contents of al with 3
|
||||||
|
jnz back ;if not zero then jump to back
|
||||||
|
exitprog ;exit program
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
;-------- ADD & SHIFT ---------
|
||||||
|
shft_add: ;shft_add procedure
|
||||||
|
dispmsg m2,l2 ;Displaying the second message
|
||||||
|
call getnum ;call getnum procedure
|
||||||
|
mov [mcand],rax ;mov contents of rax(multiplicand) into mcand buffer
|
||||||
|
gtch input ;to read and discard ENTER key pressed
|
||||||
|
|
||||||
|
dispmsg m3,l3 ;Displaying the third message
|
||||||
|
call getnum ;call getnum procedure
|
||||||
|
mov [mplier],rax ;mov contents of rax(multiplier) into mplier buffer
|
||||||
|
gtch input ;to read and discard ENTER key pressed
|
||||||
|
|
||||||
|
mov rax,0 ;clearing the rax register
|
||||||
|
dispmsg m4,l4 ;displaying the fourth message
|
||||||
|
|
||||||
|
mov rax,0 ;clearing the rax register
|
||||||
|
mov rcx,8 ;taking count of 8 in rcx register
|
||||||
|
mov dl,[mplier] ;multiplier is 8 bits so it occupies dl
|
||||||
|
mov bl,[mcand] ;mupltiplicand is 8 bits so it occupies bl
|
||||||
|
|
||||||
|
;we will put Q in higher 8 bits of ax (i.e. ah)
|
||||||
|
;and multipler in lower 8 bits of ax (i.e. al)
|
||||||
|
|
||||||
|
mov ah,0 ;clearing ah register
|
||||||
|
mov al,dl ;ah already 0 and al now contains multiplier
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
ll3: ;loop 3 (s3)
|
||||||
|
mov dh,al ;mov contents of al into dh as dh is used as temporary
|
||||||
|
and dh,1 ;check d0 bit of multiplier
|
||||||
|
jz ll8 ;if d0 bit was zero, Z flag will be set (s2)(if zero jmp to loop 8)
|
||||||
|
add ah, bl ;d0 bit of multiplier is set
|
||||||
|
;so add multiplicand to Q(add bl into ah)
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
ll8: ;loop 8 (s2)
|
||||||
|
shr ax,1 ;shift both Q (ah) and muplitiplier (al) right 1 bit
|
||||||
|
dec rcx ;decrement contents of rcx
|
||||||
|
jnz ll3 ;if not zero then jump to loop 3 (s3)
|
||||||
|
call disphx16 ;call procedure disphx16
|
||||||
|
jmp back ;jump to back
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
getnum: ;procedure to get a 2 digit hex no from user
|
||||||
|
; number returned in rax
|
||||||
|
|
||||||
|
mov cx,0204h ;02 digits to display and 04 count to rotate
|
||||||
|
mov rbx,0 ;clearing rbx register
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
ll2: ;loop 2
|
||||||
|
push rcx ;syscall destroys rcx.Rest all regs are preserved
|
||||||
|
gtch input ;to read and discard ENTER key pressed
|
||||||
|
pop rcx ;pop the contents of rcx
|
||||||
|
|
||||||
|
mov rax,0 ;clearing the contents of rax
|
||||||
|
mov al,byte[input] ;get choice
|
||||||
|
sub rax,30h ;subtract 30h from contents of rax
|
||||||
|
cmp rax,09h ;compare the contents of rax register with 09h
|
||||||
|
jbe skip1 ;if equal then jump below to skip1 label
|
||||||
|
sub rax,7 ;subtract 7 from contents of rax register
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
skip1: ;skip1 label
|
||||||
|
shl rbx,cl ;shift multiplicand and count to the left
|
||||||
|
add rbx,rax ;add contents of rax register to the contents of rbx register
|
||||||
|
dec ch ;decrement the contents of ch register
|
||||||
|
jnz ll2 ;if not zero then jump to loop 2
|
||||||
|
mov rax,rbx ;mov contents of rbx register into rax register
|
||||||
|
ret ;return
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
disphx16: ;Displays a 16 digit hex number passed in rax
|
||||||
|
mov rbx,rax ;move contents of rax register into rbx register
|
||||||
|
mov cx,1004h ;16 digits to display and 04 count to rotate
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
ll6: ;loop 6
|
||||||
|
rol rbx,cl ;rotate multiplicand and count to the left
|
||||||
|
mov rdx,rbx ;mov contents of rbx register into rdx register
|
||||||
|
and rdx,0fh ;anding contents of rdx register with 0fh
|
||||||
|
add rdx,30h ;adding contents of rdx register with 30h
|
||||||
|
cmp rdx,039h ;comparing the contents of rdx register with 39h
|
||||||
|
jbe skip4 ;if equal then jump below to skip4 label
|
||||||
|
add rdx,7 ;add 7 to the contents of rdx register
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
skip4: ;skip4 label
|
||||||
|
mov byte[output],dl ;mov contents of dl register into output buffer in bytes
|
||||||
|
push rcx ;push the contents of rcx register
|
||||||
|
dispmsg output,1 ;displaying the output
|
||||||
|
pop rcx ;pop the contents of rcx
|
||||||
|
dec ch ;decrement the count(contents of ch)
|
||||||
|
jnz ll6 ;if not zero the jump to loop 6
|
||||||
|
ret ;return
|
||||||
|
|
||||||
|
;------------------------------
|
||||||
|
; END OF CODE
|
5
Codes/README.md
Normal file
5
Codes/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# CODES NOT HERE?
|
||||||
|
|
||||||
|
There are some codes that haven't been tested yet available in the [testing branch](https://git.kska.io/sppu-se-comp-content/Microprocessor/src/branch/testing), check it out, you might find 'em!
|
||||||
|
|
||||||
|
---
|
Loading…
Reference in New Issue
Block a user