0

我正在Assembly 中编写一个对字符串数组进行冒泡排序的程序。零长度字符串终止数组。我通过声明一个 DWORD 数组来解决这个问题,其中应存储字符串 var.,即字节大小。我的主要问题不是冒泡排序本身,而是存储在数组中的字符串没有完全输出。

为了清楚起见,这是我的代码:

.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

可以看出,还没有进行冒泡排序......

'popltDone' 下面的行只是我在乱看字符串是否可以很好地转移到数组中。然而,当打印在屏幕上时,只显示了四个字符!整个字符串线都没有被打印出来,这让我发疯。有人可以告诉我我做错了什么吗?

感谢任何花时间阅读本文的人。

4

1 回答 1

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 语言编写代码,反编译它,这很可能是你会看到的。重写您的比较和输出函数以使用指向字符串的指针而不是字符串中的文字字符,您将解决问题。

于 2012-04-06T11:54:29.410 回答