【问题标题】:Assembly Character Comparison Problem汇编字符比较问题
【发布时间】:2011-04-26 12:54:24
【问题描述】:

我们正在尝试在汇编中实现莱文斯坦距离算法,并从 C 代码中调用汇编函数。但是我们有一些字符比较问题并且无法解决问题。

函数接受两个 char* 参数。在前两行中,我将这些地址移动到 ecx 和 edx。 iminusOne 和 jminusOne 是获取当前(代码块是循环的一部分)字符的索引。找到字符的地址后,我将字符移动到寄存器中并使用 cmp 进行比较。但是例如,当我比较两个字符串“apple”和“apple”时,前三个字符似乎相等,但其他两个不相等。我将 ecx 和 edx 保存的地址的字符打印到控制台,它们似乎也相等。

  mov ecx,[esp+4]
  mov edx,[esp+8]

  mov ebx,[iminusOne]
  add ecx,ebx
  mov ebx,[jminusOne]      
  add edx,ebx
  call printCurrentChars
  mov edx,[edx]; bellekteki veriyi direk register a yüklüyoruz çünkü karşılaştırma 
       ; işlemine parametre olarak iki adres alanı veremiyoruz
  mov ecx,[ecx]
  cmp edx,ecx
  jne notEqual
  call printHello
  mov ebx,eax

当前字符的打印结果:

苹果

你好世界! //确定
ap
ap
阿尔
ae

pp
你好世界! //确定
pp
// 这应该是相等的,但不是



pp
// 这应该是相等的,但不是
pp
你好,世界!



lp
lp
ll
// 这应该是相等的,但不是

一个
ep
ep
埃尔
ee
// 这应该是相等的,但不是

【问题讨论】:

  • 我可以问一下为什么你在用 C 语言开发应用程序的其余部分时用机器代码实现它吗?
  • 这是系统编程课程作业,主要目的确实不是算法。

标签: assembly comparison x86 character


【解决方案1】:
mov edx,[edx]
mov ecx,[ecx]
cmp edx,ecx

我认为您是在比较双字而不是字节。

试试

mov dh, byte ptr [edx]
mov ch, byte ptr [ecx]
cmp dh, ch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多