2 notomorrow NoTomorrow_ 于 2016.04.02 18:24 提问

nasm提示非法指令,小白求解答 5C

刚学nasm,我捣鼓这个问题半天了,还是没找到bug,跪求解答,要用彩色输出fibonacci函数的值,输入用空格隔开如“12 13 14”,我用getint去获得输入的值,调用fibonacci1去计算,算出来的值用150位长的数组每个数组存一个字符,每次相加由arraybefore加到arraynow再由arraynow加到arraybefore里循环做加法,再用compare函数去选择颜色输出
代码如下
section .text
global main
;Declaring the external functions to be used in the program.......
getint: ;get the index of fibonacci
mov eax,3
mov ebx,0
mov ecx,tem1
mov edx,1
int 80h

mov eax,3
mov ebx,0
mov ecx,tem2
mov edx,1
int 80h
cmp word[tem2],32
je count1
cmp word[tem2],10
je count1

mov eax,3
mov ebx,0
mov ecx,tem3
mov edx,1
int 80h
cmp word[tem3],32
je count10
cmp word[tem3],10
je count10

count10:
sub word[tem1],30h
sub word[tem2],30h
mov ax,word[tem1]
mov dx,10
mul dx
add ax,word[tem2]
mov word[num],ax
call fibonacci1
call compare
cmp word[tem3],10
je exit
jmp getint
count1:
sub word[tem1],30h
mov ax,word[tem1]
mov word[num],ax
call fibonacci1
call compare
cmp word[tem2],10
je exit
jmp getint
ret

compare:
cmp byte[number],1
je print1
cmp byte[number],2
je print2
cmp byte[number],3
je print3
print1:
mov eax,4
mov ebx,1
mov ecx,echo1
mov edx,sizeEcho1
int 80h
add byte[number],1
jmp printfibo1
print2:
mov eax,4
mov ebx,1
mov ecx,echo2
mov edx,sizeEcho2
int 80h
add byte[number],1
jmp printfibo1
print3:
mov eax,4
mov ebx,1
mov ecx,echo3
mov edx,sizeEcho3
int 80h
mov byte[number],1
jmp printfibo1
ret

printfibo1:
pop edx
mov eax,arrayNow
cmp eax,edx
je end
mov eax,arrayBefore
cmp eax,edx
je end
mov al,byte[edx]
mov byte[fibo],al
sub edx,1
push edx
mov eax,4
mov ebx,1
mov ecx,fibo
mov edx,1
int 80h
jmp printfibo1
end:

mov eax,4
mov ebx,1
mov ecx,echoEnd
mov edx,sizeEchoEnd
int 80h
mov ecx,150
mov ebx,arrayNow
mov eax,arrayBefore
recover: ;recover array to init status
mov byte[ebx],-1
add ebx,1
mov byte[eax],-1
add eax,1
loop recover
ret

fibonacci1:
mov cx,word[num]
mov al,0
add al,30h ;integer 0 to char

mov byte[arrayBefore],al ;init arrayBefore[0] = '0'
mov al,1
add al,30h ;integer 1 to char
mov byte[arrayNow],al ;init arrayNow[0] = '1'
add:
cmp cx,0
je print
sub cx,1
cmp byte[record],0 ;the result of add to which array
je nowToBefore
jmp beforeToNow
nowToBefore:
mov ebx,arrayNow
mov edx,arrayBefore
mov byte[record],1
jmp addNumber
beforeToNow:
mov edx,arrayNow
mov ebx,arrayBefore
mov byte[record],0
jmp addNumber
addNumber: ;add index of i of two arrays[i]
mov al,byte[ebx]
cmp al,-1
je add ;jump to the next add
sub al,30h
mov ah,byte[edx]
cmp ah,-1

jne continue
mov ah,0
add ah,30h
continue:

sub ah,30h
add ah,al
add ah,byte[carry1]
cmp ah,10
jnb above10
mov byte[carry1],0
add ah,30h
mov byte[edx],ah
add ebx,1
add edx,1
jmp addNumber
above10:
mov byte[carry1],1
sub ah,10
add ah,30h
mov byte[edx],ah
add ebx,1
add edx,1
cmp byte[ebx],-1
je carry
jmp addNumber
carry:
mov ah,1
add ah,30h
mov byte[edx],ah
jmp add

print: push edx
ret

main:
;Main( ) Function
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, size1
int 80h
call getint

exit:
mov ebx , 0
mov eax, 1
int 80h

section .data
fmt: db "%d",0
msg1: db "Enter Fibonacci numbers:"
size1: equ $-msg1

number: db 0 ;which color to print
echo1: db 1Bh,"[48;32m"
sizeEcho1: equ $-echo1
echo2: db 1Bh,"[48;33m"
sizeEcho2: equ $-echo2
echo3: db 1Bh,"[48;34m"
sizeEcho3: equ $-echo3
echoEnd: db 1Bh,"[0m",10
sizeEchoEnd: equ $-echoEnd
arrayBefore: TIMES 150 db -1 ;init array of all -1
arrayNow: TIMES 150 db -1 ;the same as before
carry1: db 0 ;carry if the result of add two integers
record: db 0 ;record add arrayNow to arayBefore or opp

section .bss
num: resw 1 ;the index of fibonacci
tem1: resw 1
tem2: resw 1
tem3: resw 1
fibo: resb 1 ;as a byte to print

1个回答

devmiao
devmiao   Ds   Rxr 2016.04.03 03:58
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
[Intel汇编-NASM]基本指令
1. 过程调用:     1) 即call和ret指令的组合使用,这里我们先介绍call指令的使用方式;     2) 16位段内直接相对近调用:         i. 格式:call near(可省) 标号/立即数;         ii. near就表示近的意思,但是near可以省了,汇编器会默认为是16位段内直接相对近调用;         iii. 直接是指:调用的过程的地址直接
汇编指令集:NASM带的指令列表
; insns.dat    table of instructions for the Netwide Assembler;; The Netwide Assembler is copyright (C) 1996 Simon Tatham and; Julian Hall. All rights reserved. The software is; redistributable under
NASM 数据传送指令
r8——任意一个8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL r16——任意一个16通用寄存器AX/BX/CX/DX/SI/DI/BP/SP reg——代表r8或r16 seg——段寄存器CS/DS/ES/SS m8——一个8位存储器操作数单元(包括所有主存寻址方式) m16——一个16位存储器操作数单元(包括所有主存寻址方式) mem——代表m8或m16 i8——一
nasm汇编语言小程序:计算多个指定位置的Fibonacci值
题目要求如下:输入多个参数,每个参数间以空格隔开,最后以回车结束输入,要求输出指定参数位置的Fibonacci值 我的编程环境:Ubuntu 14.04 64位系统 + DOSBox + NASM + gedit 首先,考虑输入问题,我采取的是逐个读入字符的方式,读到空格则代表上一个数据输入完毕,读入回车则代表所有数据输入完毕:     1)利用buffer存取每一个数据,将buffer
小白学c++之MFC
把vc 6.0放到 vs2012下运行时 强大的报错li
Nasm org 理解
org 指令作用,就是为程序中所有的内部地址引用增加一个段内偏移值。 org 主动指示程序将要加载到内存的起始地址,org指令本事并不能决定程序要加载到内存的什么位置 它只是告诉编译器我的程序在编译好后需要加载到 XXXX地址所以请你在编译时帮我调整好数据访问时的地址  org指令只是会在编译期影响到内存寻址指令的编译(编译器会把所有程序用到的段内偏移地址自动加上or
[Intel汇编-NASM]基本语法
1. NASM编译器介绍:     1) Netwide Assembler,是目前唯一开源且免费的汇编器;     2) 该汇编器只提供编译的功能,但不提供连接的功能,在Linux下编译器产生.o文件后还需要使用ld链接器和操作系统的库链接才能形成可执行文件,而在Windows下需要使用MASM的ml链接器连接形成.exe文件;     3) 这里我们先介绍实模式编程,由于Linux以及W
NASM指令:cld,lodsb
LODSB/LODSW 取字符串指令LODSB/LODSW将位于DS段由SI所指的存储单元的内容取到AL或AX中。用LODSB时,取的是字节,取完后,地址自动加1或减l;用LODSW时取的是字,取完后地址自动加2或减2。当方向标志位DF=0时,则esi自动增加;DF=1时,esi自动减小。  因为使用LODSB/lODSW指令时,取来的字节或字放在AL或AX中,所以LODSB/LO
illegal instruction非法指令的解决思路
我移植x264到开发板上,arm linux系统。移植好后将库都拷贝到nfs文件系统上,可是执行后出现illegal instruction的错误。 可能是x264配置问题,我的x264开始的编译配置是 ./configure  --host=arm-none-linux-gnueabi  --cross-prefix=arm-linux-  --prefix=/opt/x264-ar
nasm : test instruction - test
汇编指令test操作数2的测试 ; /// @file boot_dispmsg/testcase_op_code_test.asm ; /// @brief 测试jmp命令的向上跳和向下跳的的目标地址计算 ; /// @note 编译命令行 ; /// cd D:\prj\nasm_prj\boot\boot_dispmsg ; /// d: ; /// C:\nasm\nasm.e