我正在汇编中编写一个程序,它将对一串字符串进行冒泡排序。零长度字符串终止数组。我通过声明一个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个字符!整个字符串线都没有打印出来,这让我疯狂。有人可以告诉我我做错了什么吗?
感谢任何人花时间阅读本文。
答案 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编写代码,反编译它,这很可能是你会看到的。重写比较和输出函数以使用指向字符串的指针而不是字符串中的文字字符,您将解决问题。