2014-01-29 3 views
0

그래서 저는 assemlby를 처음 접했습니다. 내 임무는 문자열의 하위 문자열을 확인하고 예/아니오 응답을 출력하는 것입니다. 두 문자열은 사용자가 입력합니다.어셈블리의 문자열 비교

문자열의 오프셋을 bx 레지스터에 넣고 bp 레지스터에 부분 문자열의 오프셋을 둡니다. di 및 si 레지스터의 인덱스 번호를 사용하여 문자열의 문자를 비교하려고합니다. 두 인덱스 레지스터 모두 2로 설정되며, 문자열의 첫 번째 문자 여야합니다.

mov dl,[bx+di] 
mov al,[bp+si] 
cmp dl,al 
jz AnswerYes 
jmp AnswerNo 

각 문자열의 첫 번째 문자를 비교하는 데 사용되었습니다.

두 문자열에 'a'를 입력하면 프로그램이 AnswerYes로 이동하고 '예'를 출력해야합니다. [bx + di]와 [bp + si]를 프린트 할 때 두 프로그램 모두 'a'를 출력합니다. 즉, 프로그램은 항상 AnswerNo로 점프합니다.

내가 이렇게 할 경우 :

cmp dl,'a' 

그들이 동일한 의미, 우리의 예를 인쇄합니다.

나는이 수행 할 때

cmp al,'a' 

그들이 동일하더라도, 아니 출력합니다을.

전에는 사용 해본 적이 없기 때문에 bp register를 사용하여 문제가 있다고 생각합니다. 나는 항상 내 프로그램에서 하나의 문자열만을 사용했는데, 항상 bx 레지스터를 사용했다.

미리 도움을 주셔서 감사합니다.

+1

귀하의 가정이 정확하다고 생각합니다. BP의 사용은 스택 기반 버퍼를 의미합니다. 예를 들어 다음을 사용하여 직접 테스트 할 수 있습니다. BP 대신 CX. –

+0

BP 대신 CX를 사용하면 '잘못된 인덱싱 노드'오류가 발생하므로 [cx + si]를 사용할 수 없습니다. 문자열과 인덱스 번호의 오프셋에 사용할 수있는 레지스터의 다른 조합 (예 : [bx + di])이 있습니까? – user3249071

+0

'잘못된 색인 노드 '- 정확한 오류입니까? 흠. 16 비트 어셈블러를 코딩 한 지 수십 년이 지났기 때문에 해당 플랫폼의 정확한 제약 조건은 희미한 기억이었습니다. 많은 사람들에게 그렇게 될 것으로 생각합니다. 그래서 책이 필요합니다. 또는 일부 x86 샘플의 경우 Google을 사용해 볼 수도 있습니다. –

답변

1

로드 문자열 DS:SIES:DI에 주소, 그리고 (그렇지 않으면 거기에 길이 바이트를 제로-확장하거나 그것으로 알려진 길이를 넣어, 당신은 C 문자열을 사용하는 경우 FFFFh 만들기) CX로 길이를 넣어.

그런 다음 CLD을 사용하여 DF (방향 플래그)을 지우고 REPE CMPSB을 사용하여 비교를 수행하십시오. 결과는 ZF (0/같음 플래그)입니다.