【问题标题】:How to compare an array with another array in Assembly language如何在汇编语言中将一个数组与另一个数组进行比较
【发布时间】:2013-10-12 16:09:19
【问题描述】:

我试图将 array1 与 array2 进行比较。这是我的代码的一部分,但它不起作用。

mov si, 00
mov di, 00    

Compare:
cmp array1[si], array2[di]
je checking
jmp compare    

我正在做一个要求用户输入字符串的汇编程序。第一个字符串被标记为输入。第二个字符串是旧的字符序列。 第三个字符串是新替换的字符序列。


示例:

输入:hatatat

旧字符串:at

替换为:嗯

输出:呵呵


【问题讨论】:

  • cmp 不能有两个内存操作数。首先将其中一个字符加载到寄存器中,或使用cmps 指令。此外,您需要在比较的每对字符之后增加 sidi,并进行某种检查以查看您是否已超出任一数组的末尾。

标签: arrays assembly x86 compare x86-16


【解决方案1】:

指令cmp 与大多数x86 指令一样不能同时处理两个内存位置。您需要在寄存器中加载其中一个参数。例如:

mov   al, [Array1+si]
cmp   al, [Array2+di]

也许,有一组指令可以同时处理两个内存参数 - 字符串指令为lods, stos, cmps, movs, ... 这些指令始终使用 [si] 和/或 [di](32 位模式下的 esi 和 edi)中的内存指针,并且不接受常量偏移量。

mov   si, Array1
mov   di, Array2
cld              

cmpsb  ; compares two bytes - from [si] and [di] and then increments si and di by 1

请阅读说明参考手册以获得更详细的说明。

注意:只要您没有提供有关首选汇编语法的信息,我将在示例中使用 FASM 语法。如果您使用的是其他汇编程序,您可能应该根据其语法编辑代码。

【讨论】:

  • 你不比较Array1+si(加载到alArray2+s1,然后inc si?或者比较[si]与[di]和inc两者?
  • @Davislor 是的,在这种情况下使用其中一个寄存器更好,但是 OP 使用 di 和 si,我想让代码尽可能接近他的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多