【问题标题】:Check null character in assembly language检查汇编语言中的空字符
【发布时间】:2023-03-23 15:15:01
【问题描述】:

我是汇编语言的新手。需要明确的是,这是家庭作业。问题是给定一个char *list,我怎样才能找到哪个字符是字符串的结尾? 所以我有

xor ecx, ecx; //counter
loop1:
mov esi, list;
mov eax, [esi + ecx];
cmp eax, 0x00; //check if the character is null
je end;
inc ecx;
jmp loop1;

end:

但是,循环在到达字符串末尾时不会终止。我想知道我做错了什么。我一直在书籍和网上寻找解决方案,但它们看起来都像我所做的那样。任何帮助将不胜感激!

编辑:是的,计数器应该在循环之外。

【问题讨论】:

  • 是一个特定的测试用例还是全部失败?你试过空字符串吗?
  • 你能提供完整的源代码吗?列表是如何定义的?它是从用户输入中读取的吗?它是在数据部分中静态定义的吗?
  • 输入例如“Hello World”,循环应该在“d”之后终止,但它没有。
  • 在每次迭代时将计数器重置为零可能不是您想要的。

标签: string assembly null


【解决方案1】:
  • 您不应将计数器作为循环的一部分进行重置。
  • 不应将地址初始化为循环的一部分。
  • 零终止只是一个字节,但您测试的是一个完整的 dword。
  • 跳转次数越少,您编写的代码就越好

将所有这些放在一起,我们得到了

  mov esi, list
  mov ecx, -1
loop1:
  inc ecx
  cmp byte [esi + ecx], 0x00; //check if the character is null
  jne loop1;

【讨论】:

    【解决方案2】:

    您一次读取几个字节,并测试它们是否全为零。

    尝试只读取一个字节:

    mov al, [esi + ecx];
    cmp al, 0x00; //check if the character is null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多