2017-01-18 8 views
-3

После кода не работаетКак проверить данное число является положительным или отрицательным в i386 ассемблере

cmp ax, 0 jl NegativeNumber ;jump to negative statements

test ax , 0x80 ;to compare sign bit. but it doesn't work 

Ассемблер не перескакивает к процедуре NegativeNumber, хотя введенный номер отрицательный.

Ниже мой фактический код

section .data 
str1:db 10,13, 'Enter the number' 
str1len equ 19 
str2: db 10,13, 'The number is positive' 
str2len equ 22 
str3 : db 10, 13, 'The number is negative' 
str3len equ 22 

section .bss 

    num resw 1 
    cbuff resw 1 


global _start 
section .text 
_start: 

%macro sys_read 2 
    mov rax,0 
    mov rdi,0 
    mov rsi,%1 
    mov rdx,%2 
    syscall 
%endmacro 

%macro sys_write 2 
    mov rax,1 
    mov rdi,1 
    mov rsi,%1 
    mov rdx,%2 
    syscall 

%endmacro 

    call GetNumber 



GetNumber: 
    sys_write str1, str1len 
    sys_read cbuff , 1 
    mov ax , [cbuff] 
    cmp ax , 0h 
    jl NumberNegative 
     sys_write str2, str2len 
     ret 

NumberNegative: 

    sys_write str3, str3len 
     ret 

Есть ли другой способ определить данное число является положительным или отрицательным без использования флагов? Я что-то делаю неправильно? BTW Я использую NASM на Linux ubuntu.

+1

Что такое 'as'? Вы имели в виду 'ax'? Кроме того, если вы имеете дело с 16-битными номерами, вы должны проверить бит 15, а не бит 7 (или просто сделать «test ax, ax',' js Negative'). – Michael

+0

Да. Сожалею. Его топор. Теперь я исправил вопрос. Хорошо, не могли бы вы рассказать мне, как я могу проверить 15 бит? Спасибо – MCCshreyas

+1

2^15 = 0x8000, используйте это. –

ответ

1

Интернет NASM с Linux: http://www.tutorialspoint.com/compile_assembly_online.php

Пример:

section .text 
    global _start  ;must be declared for using gcc 
_start:      ;tell linker entry point 
    mov  ax,-4  ; test value 

doFewTests: 
    push eax 

    cmp  ax,0 
; test ax,ax 
; test ax,0x8000 

    jl  handleNegative 
    ; handle non-negative 
    ; fake conversion to ASCII for numbers 0-9 
    add  al,'0' 
    mov  ecx,strPositive 
    mov  edx,lenPositive 
    mov  [ecx+edx-2],al 
    jmp  printMessage 
handleNegative: 
    ; fake conversion to ASCII for numbers -9 to -1 
    neg  al 
    add  al,'0' 
    mov  ecx,strNegative 
    mov  edx,lenNegative 
    mov  [ecx+edx-2],al 
printMessage: 
    mov  ebx, 1  ;file descriptor (stdout) 
    mov  eax, 4  ;system call number (sys_write) 
    int  0x80  ;call kernel 
    pop  eax 
    inc  ax 
    cmp  ax,5 
    jl  doFewTests ; do -4 to +4 demonstration loop 
    ; exit 
    mov  eax, 1  ;system call number (sys_exit) 
    int  0x80  ;call kernel 

section .data 

strPositive db 'Positive number: x', 10 
lenPositive equ $ - strPositive 
strNegative db 'Negative number: -x', 10 
lenNegative equ $ - strNegative 

Кстати, нет никакого смысла работать без отладчика, и вы, очевидно, не слушал. Этот сайт хорош только для демонстрации окончательного примера, невозможно изучить программирование Ассамблеи на нем, потому что у него нет установленного отладчика.

Если вы не слушаете, и вы просто ищете простой способ, вы никогда не узнаете Ассамблею, потому что в Ассамблее есть только «правильные» способы, не простые.

ПОСЛЕДНЕЕ ВРЕМЯ: используйте отладчик.

Если вы не знаете, как использовать нижеследующие инструкции https://stackoverflow.com/tags/x86/info, войдите в gdb, а затем найдите другие учебники и документы, как их использовать.

В конце концов попробовать графический внешний интерфейс, как ddd (но последний раз, когда я пытался, опыт был не очень хорошо, научиться контролировать gdb это долгосрочные инвестиции в ГНУ мире, как отладчик используется также другими языками высокого уровня, так не стесняйтесь тратить дней на нем.

(я использую edb отладчик, но я должен был скомпилировать его из источников, так что это, вероятно, еще один «может червей» для вас).


Результат этой эклектичной exa mple:

sh-4.3$ nasm -f elf *.asm; ld -m elf_i386 -s -o demo *.o 
sh-4.3$ demo 
Negative number: -4 
Negative number: -3 
Negative number: -2 
Negative number: -1 
Positive number: 0 
Positive number: 1 
Positive number: 2 
Positive number: 3 
Positive number: 4 
+0

Спасибо, чувак. Он работает наконец ......... – MCCshreyas