Ես դժվարանում եմ պարզել, թե ինչպես ճիշտ օգտագործել printf-ն այս գործառույթում: Այսպիսով, ֆունկցիան կոչվում է multInts և պետք է բազմապատկի առաջին զանգվածի առաջին տարրը երկրորդ զանգվածի առաջին տարրով և շարունակի ամբողջ զանգվածով։ Այնուամենայնիվ, լաբորատորիայի հրահանգները նշում են, որ ես չեմ կարող printf-ը զանգահարել հիմնական գործառույթում: Այսպիսով, ես պետք է տպեմ «Products:\n» բառը և դրանից հետո յուրաքանչյուր նոր տողում տպեմ արտադրանքը: Այնուամենայնիվ, ես չգիտեմ, թե ինչպես օգտագործել printf-ը օղակում: Հրահանգիչն ասաց, որ մենք պետք է «արտադրանքը հաշվարկելուց հետո զանգահարենք printf-ը ցիկլում», ինչպես նաև «պահենք և վերականգնենք զանգահարողների պահպանման գրանցամատյանները՝ նախքան printf-ը զանգահարելը», բայց ես վստահ չեմ, թե դա ինչ է նշանակում: Ահա թե ինչ տեսք ունի իմ կոդը մինչ այժմ.
.file "lab4.s"
.section .rodata
.LC0:
.string "Products: \n"
.LC1:
.string "%i \n"
.data
sizeIntArrays:
.long 5
sizeShortArrays:
.word 4
intArray1:
.long 10
.long 25
.long 33
.long 48
.long 52
intArray2:
.long 20
.long -37
.long 42
.long -61
.long -10
##### MAIN FUNCTION
.text
.globl main
.type main,@function
main:
pushq %rbp
movq %rsp, %rbp
#pass parameters and call other functions
movl sizeIntArrays, %edi #move size to registers for 1st parameter
leaq intArray1, %rsi #load effective address of intArray1 to register rsi
leaq intArray2, %rdx #load effective address of intArray2 to register rdx
call multInts #call multInts function
movq $0, %rax #return 0 to caller
movq %rbp, %rsp
popq %rbp
ret
.size main,.-main
##### MULTINTS
.globl multInts
.type multInts,@function
multInts:
pushq %rbp
movq %rsp, %rbp
#add code here for what the functions should do
movq $0, %r8 #initialize index for array access in caller save reg
movq $0, %rcx #initialize 8 byte caller save result reg
loop0:
cmpl %r8d, %edi #compare index to size
je exit0 #exit if equal
movslq (%rsi,%r8,4),%rax # Load a long into RAX
movslq (%rdx,%r8,4),%r11 # Load a long into R11
imulq %r11, %rax # RAX *= R11
addq %rax, %rcx # RCX += RAX
incq %r8 #increment index
jmp loop0
exit0:
movq $.LC0, %rdi
movq %rcx, %rsi
movq $0, %rax
call printf
movq %rbp, %rsp
popq %rbp
ret
.size multInts,.-multInts
Այն, ինչ ես փորձել եմ անել, պարզապես printf հրահանգը տեղափոխել է հանգույցից առաջ, բայց դա ինձ տալիս է սեգմենտավորման սխալ հանգույցը գործարկելիս, քանի որ %rdi և %rsi պարունակում են զանգվածների հասցեները, որոնք պետք է օգտագործվեն ցանցում: հանգույց. Ինչպե՞ս կարող եմ շրջանցել դա և ո՞ր գրանցամատյանները պետք է օգտագործեմ: Բացի այդ, ինչպե՞ս կարող եմ զանգահարել printf-ին օղակի ներսում:
Արդյունքը պետք է նման լինի հետևյալին.
Products:
200
-925
1386
-2928
-520