2012-04-06 3 views
0

나는 문자열 배열 배열을 버블 정렬 할 어셈블리 프로그램을 작성하고 있습니다. 길이가 0 인 문자열은 배열을 종료합니다. DWORD 배열을 선언하여이 접근법에 접근했습니다.이 배열에서는 바이트 크기 인 문자열 var가 저장됩니다. 내 주요 문제는 버블 정렬 자체가 아니지만 배열에 저장된 문자열은 완전히 출력되지 않았습니다.DWORD의 배열에 저장된 문자열 인쇄

가 이 는, 정렬이 아직 진행되고 더 버블 ...

'popltDone'아래 라인이 날 볼 수있는 바와 같이 없습니다

.586 
.MODEL FLAT 

INCLUDE io.h ; header file for input/output 

space   equ  0 
cr    equ  0dh 

.STACK 4096 

.DATA   
myStrings    byte "Delts",0 
         byte "Abs",0 
         byte "Biceps",0 
         byte 0 

labelStrOut    byte "Output is: ", 0 

stringOut    dword 11 dup (?) 

stringNum    dword 0 
stringArray    dword 20 dup (?)    


.CODE 

_MainProc PROC 

      mov edi, offset myStrings 
      mov esi, offset stringArray 


popltLp:  
      cmp BYTE PTR [edi], 0 
      jz popltDone 
      mov ebx, [edi] 
      mov DWORD PTR [esi], ebx    
      add esi, 4 
      inc stringNum 
      xor ecx, ecx 
      not ecx 
      xor al, al 
      repne scasb 
      jmp popltLp 

popltDone: 
      xor edx, edx 


      lea esi, stringArray 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 
      add esi, 4 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 
      add esi, 4 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 


outptDone: 

      mov eax, 0      ;  exit with return code 0 
      ret 
_MainProc ENDP 


END        ; end of source code 
:

희망 여기 내 코드, 그것은 명확하게하려면 문자열이 배열로 옮겨 졌는지 확인하기 위해 주위를 어지럽 힙니다. 그러나 화면에 인쇄 할 때 단지 4 자만 나타납니다! 전체 문자열 줄이 인쇄되지 않고 있었기 때문에 현재 나를 미치게 만듭니다. 누군가 내가 잘못하고있는 것을 말해 줄 수 있습니까?

누구나 시간을내어 이것을 읽어 주셔서 감사합니다.

+0

이 숙제가 있습니까? 출력을 추가 할 수 있습니까? – wallyk

+0

화면에는 "Delt", "Abs"및 "Bice"라는 출력이 있습니다. 항상 4자를 ... 왜 배열을 문자열을 저장하는 잘못된 지침을 사용해야합니다. –

답변

0

문제는 문자열 포인터를 올바르게 사용하고 있지 않다는 것입니다.

mov ebx, [edi] 
mov DWORD PTR [esi], ebx 

영어로이 번역한다면, 그것은이 같은 것 : 특히, 여기에 내가 말하는 겁니다 코드입니다

Move the 4 byte value pointed to by edi into ebx. 
Move the value in ebx into the memory address pointed to by esi. 

이 완벽하게 합법적이고 실제로 무엇을 할 수 어떤 경우에는 당신이 원하지만, 나는 이것이 그들 중 하나가 아닌 것 같아요. 리터럴 문자열을 배열에 복사했기 때문에 문자열 배열을 출력 할 때 처음 4 자만 보이기 때문입니다. DWORD는 4 바이트이므로 처음 4 문자를 가져옵니다. 여기에 내가 작성합니다 내용은 다음과 같습니다로 번역

mov DWORD PTR [esi], edi 

:

Move the pointer value edi into the memory address pointed to by esi. 

이제 문자열의 배열하지만, ​​문자열 포인터의 배열을하지 않았습니다. C로 코드를 작성하고 디 컴파일하면 가장 많이 볼 수 있습니다. 문자열에있는 리터럴 문자 대신 포인터로 작업하도록 비교 및 ​​출력 함수를 다시 작성하면 문제를 해결할 수 있습니다.

+0

당신의 도움에 감사드립니다, Sparafusile. 이제는 새로운 수수께끼에 직면하고 있습니다. 문자열 포인터 배열 안의 요소를 출력 할 때 나는 모두 공백입니다! 아래는 제가 사용하고있는 지시입니다 ; –

+0

** 아하, 위의 제 의견을 무시하십시오 ... 나는이 사이트와 그 모든 결함에 대해 아직 익숙하지 않습니다 ... 도움, Sparafusile. 이제는 새로운 수수께끼에 직면하고 있습니다. 문자열 포인터 배열 안의 요소를 출력 할 때 나는 모두 공백입니다! 다음 내가 그것을 밖으로 인쇄에 사용했던 명령어입니다 : 레아의 ESI, stringarray입니다 출력 labelStrOut는, DWORD PTR은 [ESI] 으로 내 출력 창은 현재 주변에 얻을 수있는 방법을 파악, 비어 말했다 그것. –

+0

포인터를 포인터로 인쇄하려고합니다. 이것을 대신 사용해보십시오 : "output labelStrOut, esi".다음 문자열로 이동하려면 esi에 4를 추가하십시오. – Sparafusile

관련 문제