【问题标题】:intel assembly cmp operationintel汇编cmp操作
【发布时间】:2016-02-21 04:21:37
【问题描述】:

我刚开始学习汇编,作为一个有趣的挑战。 我已经制作了强制性的 hello world 程序以及一个简单的程序,它只要求输入然后显示它。现在我认为下一步将是一个简单的“猜我想的数字”程序,这是代码

      section .data
           First:  db 'Try and guess the number im thinking of',10
           Firstlen equ $-First
           Correct:  db 'YAY! you guessed my number correctly',10
           Correctlen equ $-Correct
           Fail:  db 'You Suck',10
           Faillen equ $-Fail
      section .bss
          num resb 5
      section .text
          global _start
      _start:
          mov eax,4
          mov ebx,1
          mov ecx,First
          mov edx,Firstlen
          int 80h

          ;get users number
          mov eax,3
          mov ebx,2
          mov ecx,num
          mov edx,5
          int 80h


          ;compare number
          mov edx,num
          cmp edx,7
          je correct; jump if equal
          jne fail; jump if not equal to exit
      fail:
          mov eax,4
          mov ebx,1
          mov ecx,Fail
          mov edx,Faillen
          int 80h

          ;exit
          mov eax,1
          mov ebx,0
          int 80h
      correct:
          mov eax,4
          mov ebx,1
          mov ecx,Correct
          mov edx,Correctlen
          int 80h

          ;exit agian
          mov eax,1
          mov ebx,0
          int 80h 

无论我做什么,总是调用失败函数。所以我假设我没有比较我的想法,但我似乎无法在网上找到任何帮助。 我做错了什么?

ps。我正在使用 nasm 2.11.05

【问题讨论】:

  • 当您使用int 0x80 从用户那里获得输入时,缓冲区会被代表数字的字符填充。因此,您需要将表示数字的 ascii 字符串转换为整数,然后将 cmp 该数字与您要测试的值一起转换。
  • 虽然这个问题并不完全重复,但答案可能会对您有所帮助:stackoverflow.com/questions/19309749/…
  • 啊,我明白了。我想我还有很多阅读要做

标签: assembly nasm


【解决方案1】:

您可以使用 je/jne 的短跳转等效项,因为它们位于同一模块中:

jz correct
jnz fail

je/jne 用于跨越内存中“更远”的距离。他们基本上做同样的事情。进行减法以进行比较,然后根据设置的标志进行跳转。在这种情况下,如果它们相等,则设置零标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多