2013-12-15 3 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 

는 불행하게도 'SEG'키워드에 대한 구문은 어셈블러 너무 구문 것이다 아마 다른 다른 8086 어셈블러에서 다른 .

+0

어떻게? 세그먼트 오프셋을로드하지 않습니다! array는 변수입니다. 그리고 코드가 작은 수의 요소로 올바르게 실행됩니다. – ammarx

+0

Ok. 어쩌면 어셈블러가 "데이터"를 "데이터"로 변환 할 것입니다. 190h 요소의 경우 "array db ..."행을 어떻게 정확하게 작성합니까? "array db 90h, 1, ..."또는 "array db 190h, ...". 물론 두 번째 것은 잘못되었습니다. 그리고 정확히 무슨 일이 일어나는가? 그리고 "mov SI, 2"대신 "SI, 2"를 추가해서는 안됩니다 - SI가 "array"의 3 번째 바이트를 가리 키기를 원하십니까? –

+0

나중에 다시 올게. 미안하지만 나는 가야 해. – ammarx