NoTomorrow_ 于 2016.04.02 18:24 提问

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

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
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
jmp printfibo1
print2:
mov eax,4
mov ebx,1
mov ecx,echo2
mov edx,sizeEcho2
int 80h
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
mov byte[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'
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
beforeToNow:
mov edx,arrayNow
mov ebx,arrayBefore
mov byte[record],0
mov al,byte[ebx]
cmp al,-1
sub al,30h
mov ah,byte[edx]
cmp ah,-1

jne continue
mov ah,0
continue:

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

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      2016.04.03 03:58

[Intel汇编-NASM]基本指令
1. 过程调用：     1) 即call和ret指令的组合使用，这里我们先介绍call指令的使用方式；     2) 16位段内直接相对近调用：         i. 格式：call near(可省) 标号/立即数；         ii. near就表示近的意思，但是near可以省了，汇编器会默认为是16位段内直接相对近调用；         iii. 直接是指：调用的过程的地址直接

; 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值

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非法指令的解决思路

nasm : test instruction - test