2016-12-22 1 views
4

28이 완벽한 숫자인지 확인하는 어셈블리 코드를 작성하려고합니다. 그러나 나는 문제가있다. 코드를 실행하면 emu8086이 내 레이블을 인식하지 못합니다. 이 코드에서 예를 들어
는 : loop HERE 명령을 실행할 때emu8086이 내 레이블을 인식하지 못합니다.

mov dl,1ch 
mov bl,00h ;sum 
mov cl,1ch ;counter 
dec cl 

HERE : mov ax,00h 
mov al,dl 
div cl ;ax/dl ah=remainder 
cmp ah,00h 
je SUM ; if ah=0 jump the label SUM 
loop HERE 

mov dh,00h 
cmp dl,bl 
je PERFECT 
hlt 

SUM : 
add bl,cl 
jmp HERE 

PERFECT : 
mov dh,01 
hlt 

, 내 코드의 첫 번째 명령 (mov dl,1ch)를 EMU8086 실행합니다. 내가 무엇을 할 수 있을지? 문제가 무엇입니까? 사전에

감사합니다 ...

+0

이 오류주의 HERE'는'CX'의 값에 따라 다르지만이 레지스터의 상반부를 초기화하지 않았습니다! 당신은'mov cl, 1Ch' ('CX'의 하반부)를 작성했습니다. –

답변

7

레이블 이름과 콜론 사이의 빈 공간을 제거합니다

 space 
     ▼ 
PERFECT : 

그것은해야한다 :`루프 :

no space 
     ▼ 
PERFECT: 
+4

emu8086이 왜 그렇게 행동하는지 궁금합니다. 콜론 앞에 공백을 추가하면 다른 코드가 생성되는 이유는 무엇입니까? –

+1

@WayneConrad : emu8086은 잘못된 입력을 거부하는 데 대한 명성이 있습니다. 나는 그것을 사용하지 않았으며, 단지 그것이 모호한 코드 (예 :'mov al, bx' 또는 OP가 조립 된 최근의 SO 질문과 같은 IIRC)를 모은 곳에 질문을 보았습니다. 나는'HERE :'가 그 심볼 테이블이나 다른 것을 나눠서 세그먼트의 첫 번째 바이트로 갈수록 분기를 조립한다는 것을 추측하고있다. 이것은 실제로 OP가 디버거를 사용하여 런타임에 실제로 분기하는 지점을 보았 기 때문에 좋은 질문입니다. emu8086이 구문 오류에 대해 경고조차하지 못했다고 가정합니다. –

관련 문제