打印出存储在DWORDS数组中的字符串

时间:2012-04-06 02:55:14

标签: arrays string 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 个答案:

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