2016-12-09 6 views
0

어셈블리 언어를 배우기 위해 공부하는 책은 아래의 예를 정의하여 # 기호를 $ 기호로 변경했습니다. 그러나 emu8086에서이 작업을 시도하면 작동하지 않습니다.이 글은 정확합니까?

나는 그것이 나에게 (18) 잘못된 매개 변수 LEA [DI]와 같은 오류가 표시 코드, 같은 고전

문제는 무엇인가를 에뮬레이션을 클릭하면?

.MODEL SMALL 
    .STACK 64 

    .DATA 
    DIZI DB 'LDA#305A' 

    .CODE 
    ANA PROC FAR 
     MOV AX, @DATA 
     MOV DS, AX 
     CLD 
     MOV AL, '#' 
     MOV BH, '$' 
     MOV CX, 9 
     LEA DS:DI, DIZI 
     REPNE SCASB 
     JNE CIK 
     MOV BYTE PTR[DI-1], BH 

    CIK: MOV AH, 4CH 
     INT 21H   

    ANA ENDP 
     END ANA 
+1

"작동하지 않음"을 확장하십시오. –

+0

"DS :"를 제거하고 DI 만 남겨 두십시오. –

+0

@Jose Manuel Abarca Rodríguez 여전히 문자열에 # 기호가 그대로 표시됩니다. – NoWeDoR

답변

1

블라인드 시도는 EMU8086에 대한 코드를 수정합니다 : 또한

ANA PROC FAR 
     MOV AX, @DATA 
     MOV DS, AX ; ds for default memory access 
     MOV ES, AX ; es for SCASB 
... 
... then modifying the char can be done without "ES:" prefix, using default "DS:" 
     JNE CIK 
     MOV [DI-1], BH 
... 

:

.MODEL SMALL 
    .STACK 64 

    .DATA 
    DIZI DB 'LDA#305A' 

    .CODE 
    ANA PROC FAR 
     MOV AX, @DATA 
     MOV ES, AX ; es for SCASB 
     CLD 
     MOV AL, '#' 
     MOV BH, '$' 
     MOV CX, 9 
     LEA DI, [DIZI] 
     REPNE SCASB   ; should now work over correct ES:DI memory. 
     JNE CIK 
     MOV [ES:DI-1], BH ; try ES:[DI-1] in case of syntax err. 
     ; ^^ needs now "ES:" prefix, because I don't set "DS" 

    CIK: MOV AH, 4CH 
     INT 21H   

    ANA ENDP 
     END ANA 

또 다른 옵션은 모두이 같은 dses을 설정하는 것입니다 읽는 것이 중요합니다. 사용하는 지침에 대한 자세한 설명. 예를 들어, SCASB는 매우 특별하며 ES:DI 메모리 포인터로 고정되어 있으며 어떤 세그먼트 접두어로도 덮어 쓸 수 없습니다 (80 % 다른 명령어와 달리 기본 DS/SS에서 다른 것으로 접두사가 붙을 수 있음). SI는 무시 될 수 따라서, : (SCASB이 속한 곳) 소스 포인터가 DS 때문에

은 "문자열"intruction 제품군은 특히 까다 롭습니다 보통

MOVSB ; moves single byte from [DS:SI] to [ES:DI], ++SI, ++DI 

    SS:MOVSB ; moves single byte [SS:SI] to [ES:DI], ++SI, ++DI 

귀하의 가정에 대한 어떠한 지시를 확인하는 가장 쉬운 방법 구글 "x86 <name_of_instruction>"을 입력하고 시간이 지남에 따라 원래의 인텔 문서를 HTML로 변환 한 것으로 인식 할 도메인 이름을 찾으십시오. 예를 들면 다음과 같습니다. http://x86.renejeschke.de/

+0

나는 당신의 코멘트 라인에 관심을 기울이지 않았다. ES가 있어야합니다 : [DI-1]. 감사! – NoWeDoR

+0

@NoWeDoR 이제 세그먼트 접두사가'[] '안에 들어가는 NASM 구문에 익숙해졌습니다. 일단 지침이 할 수있는 일에 대해 좀 더 편안 해지고 어떻게 보이는지 * 알 수있게되면,이 작은 구문의 차이점을 무시하기 시작할 것이며, 누군가가 조언을 구할 때 즉시 제대로 고칠 수있게 될 것입니다. 다른 어셈블러의 구문에서의 사고. (생성 된 머신 코드는 물론 동일하므로 디버거로 디스 어셈블하면 더 많은 다른 구문을 얻을 수 있습니다. 이번에는 디스어셈블러에서 사용하는 구문입니다) – Ped7g

+0

"... [DS : SI ] ~ [ES : DI], ++ SI, ++ DI ... "일반적으로 이러한 표기법은 * 사전 증가 *를 의미하지만 모든 문자열 기본 요소는 * 후행 증가 * 및 * 후행 감소 만 허용합니다 * –