2016-10-09 9 views
0

ich diese Zeilen schrieb:LEA Parameter sind falsch

num1 dw 7 
num1_ptr dw 0 
num1_ptr_ptr dw 0 
lea num1_ptr, num1 
lea num1_ptr_ptr, num1_ptr 
mov bx, num1_ptr_ptr 
mov bx, [bx] 
mov ax, [bx] 
call printNum ;printNum is 100% working. it prints the number in ax. 

das Problem ist, dass der Compiler sagt, dass die beiden lea Anweisungen falsche Parameter. Weiß jemand warum?

Antwort

2

Die einzig möglichen Formen der lea

sind
lea r16, mem 
lea r32, mem 
lea r64, mem 

Trotz eines CISC ist, hat x86 eine begrenzte Liste von mem-to-mem Anweisungen und lea mem, mem ist nicht auf dieser Liste.

Sie können loszuwerden, die lea-nonsense einfach Ihre Daten

num1   dw 7 
num1_ptr  dw num1 
num1_ptr_ptr dw num1_ptr 

Auch Initialisieren Sie ein dereferenzieren fehlen, wenn Sie num1 drucken möchten.

+0

es ist eine Schulaufgabe, also muss ich die Zeiger mit 0 initialisieren und Lea auf den Zeigern verwenden, damit es num1 am Ende druckt. –

+0

@GuyShilman Sie können ein Scratch-Register verwenden und dann seinen Wert speichern: 'lea ax, num1' /' mov [num1_ptr], ax' (und dasselbe für den anderen Zeiger). Beachten Sie, dass es hier keine wirkliche Verwendung für 'lea' gibt, eine mehr idiomatische' mov ax, OFFSET num1' (oder 'mov ax, num1' auf NASM) reicht aus. –