Assembly x86汇编语言中的LEA错误

Assembly x86汇编语言中的LEA错误,assembly,x86-16,Assembly,X86 16,我用16位x86汇编语言编写了一段代码来计算数组元素的平均值。它对32h和C8h元素正常工作,但当我放置190h时,LEA si,array中出现错误。为什么? 数组的前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,

我用16位x86汇编语言编写了一段代码来计算数组元素的平均值。它对
32h
C8h
元素正常工作,但当我放置
190h
时,
LEA si,array
中出现错误。为什么?

数组的前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
.
.
.
.

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

对于段,您必须使用如下MOV指令:

mov ax, seg data

不幸的是,“seg”关键字的语法在不同的8086汇编程序中是不同的,因此语法在汇编程序中可能会不同。

如何?我没有加载段偏移!数组是一个变量。我说代码可以用少量元素正确运行,好吗。也许你的汇编程序会把“数据”转换成“seg数据”——我的汇编程序不会。对于190h元素,您如何准确地编写“array db…”行?“阵列分贝90h,1,…”或“阵列分贝190h,…”。第二个当然是错误的。到底发生了什么错误?不应该是“add SI,2”而不是“mov SI,2”-你想让SI指向“array”的第3个字节吗?我稍后会回来。抱歉,我必须走了。如果“data”是段的名称,那么MASM和TASM将“data”转换为段值,如本例所示,因此
mov ax,data
movds,ax
对于这两个汇编器是正确的。对于NASM,它是mov ax,seg array。您会得到什么错误?当您尝试使用0190h尺寸时,是否可以显示代码?