2014-11-17 1 views
1

내 프로그램에서 문제가 발생했습니다. 기본적으로 문자열에서 점 뒤에 공백이 있는지 확인하고 점이 없으면 공백을 추가하지 않습니다. 그러나 나는 내 버퍼가 제한된 크기이므로이 방법에 대해 알지 못한다. 따라서 공간을 추가하면 버퍼의 마지막 글자는 지워진다. 아니면 내가 잘못하고있는거야? 미리 도움을 주셔서 감사합니다 :) 예 : Hello.Hi = Hello. 안녕어셈블리 8086 문자열에 공백 추가

MOV cx, ax 
     MOV si, offset readBuf 
     MOV di, offset writeBuf 
     work: 
     MOV dl, [si] 
     CMP dl, '.' 
     JE dot 
     increase: 
     MOV [di], dl 
     INC si 
     INC di 
     LOOP work 
     dot: 
     CMP dl+1, ' ' 
     JNE noSpace 
     JMP increase 
     noSpace: 

답변

0

코드에 몇 가지 문제가 있습니다.

CMP dl+1, ' ' 

dl의 값에 1을 추가하고 당신이 원하는하지 않은 공백 문자로 그 비교된다 첫 번째는이 라인입니다. 당신이 원하는 것은 다음 캐릭터를 비교하는 것이므로 MOV dl, [si] 또는 이와 비슷한 레지스터에로드해야합니다.

두 번째 문제는 알고리즘입니다. 가짜 코드로 시작한 다음 어셈블리 언어 버전을 만드는 것이 가장 쉬운 방법입니다. 예를 들어 :

  1. 로드 문자
  2. 는 공간이 왼쪽입니까?
  3. 없는 경우, 출구
  4. 그렇다면, 문자
  5. 않는 문자 == 기간을 저장?
  6. 1로 이동
  7. 방이 남아 있습니까?
  8. 없는 경우, 출구
  9. 그렇다면, 문자
  10. 않는 문자 == 공간
  11. 부하 공간 문자 저장?
  12. 그렇다면, 모두를 저장하는 의미 "문자를 저장"하지 않을 경우 "문자를로드"고 2

참고로 이동 한

  • 에 가서 모두가 문자를 가져 와서 si를 증가 의미하며, 문자 및 증분 di. 또한 2, 3, 4 단계는 7, 8, 9 단계와 동일합니다. 이는 코드를 한 번만 작성 (및 디버깅)해야하고 여러 번 사용할 수 있도록하는 서브 루틴이나 매크로의 가능성을 암시합니다.