2016-11-02 4 views
1

이 코드에서는 _을 배열에 삽입하려고하는데이 코드의 문제점을 잘 모릅니다. _이 배열에 삽입 될 때 막히게 될 것 같습니다. 코드를 구현하거나 수정하는 더 좋은 방법이 있습니까? 당신이 그런 식으로 초기화하기 때문에 루프를 시작하기 전에밑줄 배열

.data 
strUnderscore BYTE 20 DUP (?)    ;the array 
.code 
mov ECX,stringLength 
mov ESI, OFFSET strUnderscore 
L1: 
mov strUnderscore[ESI], '_'   ;the code runs but stucks here 
inc ESI 
loop L1 

mov EDX, OFFSET strUnderscore 
call WriteString 

답변

3

는 ESI는 이미 strUnderscore에서 지적한다. 한편, 라인

은 strUnderscore + ESI를 처리하는 문자를 작성하려고 시도합니다. 그건 맞지 않습니다. C와 유사한 용어로는 다음과 같습니다.

char *esi = strUnderscore; 
while(...) 
{ 
    strUnderscore[(int)esi] = '_'; 
    esi++; 
} 

실행중인 색인 또는 실행 포인터가 필요합니다. ESI를 0으로 초기화하거나 인덱스로 사용하거나 mov 명령의 대상 주소를 byte ptr [ESI]으로 변경하십시오.

또한 LOOP는 잘못된 명령입니다 (look up). 대신 감소와 조건부 점프를 고려하십시오. 코드에서

+1

또는 '담당자 stosb'을. –

+1

OP는 여전히 매우 기초적인 것을 배우고 있습니다. 그녀가 루프를 디버그하게하십시오. –

+0

mov에서 대상 주소 명령을 [ESI]로 변경하면 프로그램을 실행할 수 없습니다. 그것은 그 라인에 유효하지 않은 명령 피연산자를 말합니다. 원인이 무엇인지 아십니까? – student001

1

두 오류 :

  • ESI 포인터가 아닌 인덱스입니다.
  • 컴파일러는 "_"의 크기를 알지 못합니다.

의 그들을 해결하자 대신 수동 바이트 루프의

.data 
strUnderscore BYTE 20 DUP (?)    ;the array 
.code 
mov ECX,stringLength 
mov ESI, OFFSET strUnderscore ;◄■■ ESI IS POINTER TO THE VARIABLE. 
mov AL, '_'     ;◄■■ MOVE THE "_" INTO A ONE BYTE REGISTER. 
L1: 
mov [ESI], AL     ;◄■■ USE THE POINTER ESI, THE VARIABLE IS NOT NECESSARY. 
inc ESI 
loop L1 

mov EDX, OFFSET strUnderscore 
call WriteString 
+1

으로 변경하고 전체 루프 동안 'al'은 변경되지 않으므로'mov al,'_ '은'L1 : '보다 우선 할 수 있습니다. :) – Ped7g

+0

@ Ped7g, 귀하의 제안으로 편집 :) –