Cと混合すると機能するasmコードに問題がありますが、適切なパラメーターを使用してasmコードで使用すると機能しません。
;; array - RDI, x- RSI, y- RDX
getValue:
mov r13, rsi
sal r13, $3
mov r14, rdx
sal r14, $2
mov r15, [rdi+r13]
mov rax, [r15+r14]
ret
技術的には、rdi、rsi、およびrdxレジスタをそのままにしておきたいので、他のレジスタを使用します。
x64マシンを使用しているため、ポインターのバイト数は8バイトです。技術的に言えば、このコードは次のことを行うことになっています。
int getValue(int** array, int x, int y) {
return array[x][y];
}
それはどういうわけか私のCコード内で機能しますが、このようにasmで使用された場合は機能しません。
mov rdi, [rdi] ;; get first pointer - first row
mov r9, $4 ;; we want second element from the row
mov rax, [rdi+r9] ;; get the element (4 bytes vs 8 bytes???)
mov rdi, FMT ;; prepare printf format "%d", 10, 0
mov rsi, rax ;; we want to print the element we just fetched
mov eax, $0 ;; say we have no non-integer argument
call printf ;; always gives 0, no matter what's in the matrix
誰かがこれを調べて私を助けることができますか?前もって感謝します。