2016-02-21 3 views
0

Я только начал изучать сборку, как забавный вызов. Я сделал обязательную программу мира привет, а также простой, который просто запрашивает ввод, затем отображает его. Теперь я думаю, что следующий шаг будет простой «угадать номер я имею в виду» программы, здесь нет кодаintel assembly cmp operation

 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 

Независимо от того, что я действительно терпеть неудачу функция всегда вызывается. Поэтому я предполагаю, что я не сравниваю то, что я думаю, но я не могу найти какую-либо помощь в Интернете. Что я делаю неправильно?

пс. Я использую NASM 2.11.05

+1

Когда вы вводите пользователя с помощью 'int 0x80', буфер заполняется символами, представляющими числа. Поэтому вам нужно преобразовать строку символов ascii, представляющих цифры, в целое число, а затем 'cmp', это число со значением, которое вы хотите проверить. –

+0

Хотя не точный дубликат этого вопроса, и ответ может помочь вам: http://stackoverflow.com/questions/19309749/nasm-assembly-convert-input-to-integer –

+0

А я вижу, имеет смысл. Угадайте, у меня есть намного больше чтения, чтобы сделать –

ответ

0

вы можете использовать короткие прыжковых эквиваленты JE/JNE, как они в том же модуле:

jz correct 
jnz fail 

JE/JNE используются для прыжков через «далее» расстояние в памяти. Они по сути делают то же самое. Вычисление выполняется для сравнения, а затем переходит в зависимости от установленных флагов. В этом случае флаг нуля устанавливается, если они равны.

Смежные вопросы