以下代码无效
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。
答案 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