在i386汇编语言中如何检查给定数字是正数还是负数

时间:2017-01-18 10:59:09

标签: assembly x86

以下代码无效

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

有没有其他方法可以在不使用标记的情况下识别给定数字是正数还是负数? 我做错了吗? 顺便说一句,我在Linux ubuntu上使用NASM。

1 个答案:

答案 0 :(得分:1)

使用linux的在线nasm: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是对GNU世界的长期投资,因为调试器也被使用了通过其他高级语言,所以不要犹豫,花费 DAYS

(我使用edb调试器,但我必须从源代码编译它,因此可能是另一个"蠕虫病毒和#34;对你来说。

那个丑陋的例子的输出:

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