【问题标题】:Printing Out a String Stored in an Array of DWORDS打印出存储在 SWORDS 数组中的字符串
【发布时间】:2012-04-06 02:55:13
【问题描述】:

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

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

【问题讨论】:

  • 这是作业吗?你能添加你看到的输出吗?
  • 在屏幕上,输出非常多:分别是“Delt”、“Abs”和“Bice”。总是4个字符...不知道为什么,一定是使用错误的指令将字符串存储到数组中。

标签: arrays string assembly


【解决方案1】:

问题是,您没有正确使用字符串指针。具体来说,这是我所指的代码:

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

【讨论】:

  • 感谢您的帮助,Sparafusile。虽然现在我面临一个新的难题:当我输出字符串指针数组中的任何元素时,我得到的都是空白! ;下面是我使用的指令;输出它
  • **啊,忽略我上面的评论...我还是这个网站的新手,还有它的所有问题...谢谢你的帮助,Sparafusile。虽然现在我面临一个新的难题:当我输出字符串指针数组中的任何元素时,我得到的都是空白!下面是我用来打印它的指令: lea esi, stringArray output labelStrOut, DWORD PTR [esi] 如前所述,我的输出窗口是空白的,目前正在想办法绕过它。
  • 您正在尝试将指针打印到指针。试试这个:“输出 labelStrOut,esi”。要移动到下一个字符串,请将 4 添加到 esi。
  • 您好,感谢您的回复。您推荐我使用的指令“输出 labelStrOut,esi”,不幸的是给了我一个编译器错误。 “错误 A2070:无效的指令操作数”
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 2021-03-28
  • 2021-06-08
  • 2013-08-07
  • 2018-09-24
  • 2020-03-13
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多