2013-12-15 234 views
-1

我编写了一个代码来计算16位x86汇编语言中数组元素的平均值。它适用于32hC8h元素,但当我把190h错误发生在LEA si, array。为什么?x86汇编语言中的LEA错误

数组的前2个字节表示数组大小。

我使用emu8086。

data segment 

array db 32h, 00, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9, 3, -10, 7, 14, 9 


min db ? 
max db ? 
msg_average db 'The average = $' 
msg_min db 'The minimum element is: $' 
msg_max db 'The maximum element is: $'  
xxh dw ? 
xxl dw ? 

ends 

stack segment 
    dw 128 dup(0) 
ends 

code segment 

start: 

lea ax, data 
mov ds, ax 
mov es, ax 

;Getting array size 
lea si, array ;  HERE IS THE ERROR 
mov cx, [si] 
;Moving si to the location of the first element 
mov si, 0002h 
. 
. 
. 
. 
+0

你会得到什么错误?当您尝试使用0190h大小时,您可以显示代码吗? – Devolus

回答

1

使用LEA指令,您只能加载变量的偏移量,而不是段!

对于段,你将不得不使用这样的MOV指令:

mov ax, seg data 

不幸的是,“赛格”关键字的语法是不同的装配8086不同,所以语法可能会在不同的汇编。

+0

如何?我没有加载段偏移量!数组是一个变量。我说,代码正确运行的元素数量很少, – ammarx

+0

好的。也许你的汇编器会把“数据”翻译成“seg数据” - 我的一个没有。在190h元素的情况下,你如何精确写出“array db ...”行? “array db 90h,1,...”或“array db 190h,...”。第二个是错误的,当然。发生的错误究竟是什么?不应该是“添加SI,2”而不是“mov SI,2” - 您希望SI指向“数组”的第3个字节? –

+0

我稍后再回来。对不起,我得走了。 – ammarx