Finden Zahl ist gerade/Ungerade-in Montage

Ich versuche zu finden, ob eine gegebene Zahl (Eingabe durch Anwender) gerade oder ungerade ist.

Ich bin einfach die Anwendung AND operation auf binären Ziffern ein Nein. mit 1, Wenn die Zahl ungerade ist, dann wird der Betrieb infolge 0 und wir werden die Ausgangs-Zahl ist ungerade, sonst werden wir die output-Nummer ist auch.

Obwohl die Logik scheint einfach, Aber es funktioniert nicht in der code unten. Ich bin nicht immer, wo ist das problem im code. Kann mir jemand sagen, wo ist das problem

section .data
    userMsg db 'Please enter a number'
    lenuserMsg equ $ - userMsg  
    even_msg db 'Even Number!'
    len1 equ $ - even_msg
    odd_msg db 'Odd Number!'
    len2 equ $ - odd_msg

section .bss
    num resb 5    ;Reserved 5 Bytes for Input

section .text

global _start     ;must be declared for linker (gcc)

_start:
    ;User Prompt
    mov ebx, 1           ;file descriptor (stdout)
    mov ecx, userMsg     ;message to write 'Please enter a number'
    mov edx, lenuserMsg  ;message length
    mov eax, 4           ;system call number (sys_write)
    int 0x80             ;call kernel

    ;Taking user input
    mov ebx, 0           ;(stdin)
    mov ecx, num 
    mov edx, 5           ;i/p length
    mov eax, 3           ;system call number (sys_read)
    int 0x80             ;call kernel

    mov ax, [num]
    and ax, 1
    jz evnn              ;Jump on Even

    ;Printing No. is Odd
    mov ebx, 1           ;file descriptor (stdout) 
    mov ecx, odd_msg     ;message to write 'Odd Number!'
    mov edx, len2        ;message length
    mov eax, 4           ;system call number (sys_write)
    int 0x80             ;call kernel
    jmp outprog          ;Jump to exit

    ;Printing No. is Even
    evnn:
    mov ebx, 1           ;file descriptor (stdout) 
    mov ecx, even_msg    ;message to write 'Even Number!'
    mov edx, len1        ;message length  
    mov eax, 4           ;system call number (sys_write)
    int 0x80             ;call kernel

    ;Exit
    outprog: 
    mov eax, 1           ;system call number (sys_exit)
    int 0x80             ;call kernel
  • Nur so ein Gedanke -- (habe ich nicht programmiert asm seit über 30 Jahren), aber sind Sie sicher, dass die Eingabe num wird gesehen als eine Zahl? z.B. bekam ich SELTSAM für eine Eingabe der Buchstaben 'a' das ist der ascii-65.
  • Ja, die Prüfung der niedrigen bit einer Zahl ist richtig, denn Sie sind gespeichert in base2. Ihr Programm könnte kompakter sein, wenn Sie Ihre gerade/ungerade Zweig setzen Sie einfach den Zeiger und die Länge, ohne duplizieren der rest der int 0x80 system nennen. Sollten Sie kommentieren Sie Ihren code mit mindestens den symbolischen Namen für die system-call-Nummern (z.B. sys_write).
  • Sie können die Tatsache, dass die Anzahl der Zeichen Lesen von der Eingabe wird zurückgegeben, in eax aus sys_read. Ein hack wäre, um die Anzahl der Zeichen zurückgegeben, wie ein index, um die richtige zu finden die meisten ASCII-Ziffer. Die Anzahl der Zeichen zurückgegeben, gehören die Abbruch-Zeichen (0x0a). Dies könnte durch den Austausch mov ax, [num] and ax, 1 mit mov al, [num+eax-2] and al, 1 . Dies setzt Voraus, dass der Puffer ist groß genug, um die längste Zahl die einschließlich des abschließenden Charakter.
  • Wenn Sie beabsichtigen, Sie zu tun, alle anderen arbeiten mit zahlen (neben der gerade/ungerade) - Eingabe von der Konsole aus, werden Sie wahrscheinlich benötigen, um zu konvertieren der Zeichenfolge zurückgegeben, in eine ganze Zahl, und arbeiten, die auf die ganze Zahl.
  • Es ist sehr ratsam, Kommentar in Ihren code ein. Es wird helfen, jemand nicht vertraut mit den jeweiligen system-call-Nummern Hilfe zu leisten, ohne dass die Forschung die Plattform, die Sie sind auf. Es wird auch Ihren eigenen Debuggen viel einfacher.
  • Ich habe kommentiert den code bitte haben Sie einen Blick.
  • Michael Petch bereits vollständig beantwortet Ihre Frage mit seinen Kommentaren. Beachten Sie, dass wie belwood darauf hingewiesen, dass der ASCII-Wert des letzten Zeichens wird das Gegenteil odd/Ebenheit, die aus der Ziffer codiert wird.
  • statt ANDing mit 1 Sie können nur test, die nicht zerstören, die Quelle registrieren und ist effizienter

InformationsquelleAutor Atinesh | 2016-01-17
Schreibe einen Kommentar