Nasm�����ֲ� -------------------------------------------------------------------------------- ��һ��: ��� ----------------------- 1.1 ʲô��NASM NASM��һ��Ϊ����ֲ����ģ�黯����Ƶ�һ��80x86�Ļ��������֧���൱�� ��Ŀ���ļ���ʽ������Linux��'NetBSD/FreeBSD','a.out','ELF','COFF',΢��16 λ��'OBJ'��'Win32'����������������������ļ��������﷨��Ƶ��൱�ļ� ���׶�����Intel�﷨���Ƶ����򵥡���֧��'Pentium','P6','MMX','3DNow!', 'SSE' and 'SSE2'ָ��� 1.1.1 Ϊʲô����Ҫһ��������� NASM��������Ƴ������뷨��'comp.lang.asm.x86'(���߿�����'alt.lang.asm' ,������),�ӱ����Ͻ�������Ϊû��һ���õ���ѵ�x86ϵ���Ļ��������ʹ�ã� ���ԣ�����������дһ���� (*)'a86'��������������ѵģ������㲻���ܵõ�32λ�����д�Ĺ��ܣ������� ���ѣ���ֻʹ����dos�ϡ� (*) 'gas'����ѵģ�������dos�º�unix�¶�����ʹ�ã�����������Ϊ'gcc'��һ ����̨����Ƶģ������Ǻܺã�'gcc'һֱ���ṩ����������ȷ�Ĵ��룬�������� �����⹦���൱�������о��Ƕ����κ�һ��������������д�㶫������������ �����﷨��ֱ̫�����ˣ��������޷�������д��ȷ��16λ���롣 (*) 'as86'��ר��ΪMinix��Linux��Ƶģ�������ȥ��û�кܶ��ĵ����Բο��� (*) 'MASM'���Ǻܺã������൱�󣬻���ֻ��������DOS�¡� (*) 'TASM'��һЩ����ȴ������MASM���ּ��ݣ������ζ��������α������ͷ��� ��Լ�������������﷨�����Ͼ���MASM�ģ������ŵľ���һЩ����ì�ܺ���ֵ� ��������Ҳ���൱��ģ�����ֻ��������DOS�¡� ���ԣ�ֻ��NASM����ʹ�����õñ�̡�Ŀǰ��������ԭ����ƽ׶�-���Dz������� �ܹ���Խ���е���Щ���������������������bug���棬������������������õ� ��Ϣ�����������κ�����ͷ�еĶ��������õ���Ϣ(��л�����Ѿ����������˵� ����)�����ǻ��᲻�ϵظĽ����� 1.1.2 �������� ���Ķ���ΪNASM������һ���ֵ��ļ�'Licence'��ֻ���ڸ�������������ſ���ʹ ��NASM�� 1.2 ��ϵ��Ϣ ��ǰ�汾��NASM(0.98.08)��һ������С����ά��������Դ�'nasm-devel'�ʼ��б� �еõ�(�����������)���������Ҫ����bug�������Ķ�10.2�� NASM��һ����ҳ:'http://www.web-sites.co.uk/nasm'���������Ϣ�������� `http://nasm.2y.net/'�ϻ�ȡ�� ��������������ͨ��email:`jules@dsf.org.uk'��`anakin@pobox.com'�������� ϵ���������Ŀ���С�鲢�������С� ���µ�NASM�������ϴ����ٷ���վ`http://www.web-sites.co.uk/nasm'��`ftp.kernel.org', `ibiblio.org' ���汻������`comp.lang.asm.x86', `alt.lang.asm' ��`comp.os.linux.announce' ��������˽�NASM beta��ķ������͵�ǰ�Ŀ���״̬����ͨ���� `http://groups.yahoo.com/group/nasm-devel', `http://www.pairlist.net/mailman/listinfo/nasm-devel' and `http://sourceforge.net/projects/nasm' ע��������'nasm-devel'�ʼ��б��� ����վSourceforge�ϵ��б��ǽϺõ�һ���б�����Ҳ������nasmԴ�����뷢���� һ����վ��������б�Ҳ�ǹ����ģ����п��ܲ��ᱻ��������֧�֡� 1.3 ��װ 1.3.1 ��dos��Windows�°�װNASM ������õ���NASM��DOS��װ��,'nasmXXX.zip'(����.'XXX'��ʾ�ð�װ����NASM�� ����)��������ѹ�����Լ���Ŀ¼��(���磺��c:\nasm') �ð��л�������ĸ���ִ���ļ���NASM�������ļ�'nasm.exe'��'nasmw.exe',���� NDISASM��ִ���ļ�'ndisasm.exe'��'ndisasmw.exe'���ļ�����'w'��β����'Win32' ��ִ�и�ʽ����������'Windows 95'��'Windows NT'��Intel�������ϵģ�������� 16λ��'DOS'��ִ���ļ��� NASM����ʱ��Ҫ��Ψһ�ļ��������Լ��Ŀ�ִ���ļ������Կ��Կ���'nasm.exe' ��'nasmw.exe'������һ�������Լ���·���£����߿��Ա�дһ��'autoexec.bat'�� nasm��·���ӵ����'PATH'����������ȥ��(�����ֻ��װ��Win32�汾�ģ������ ϣ�����ļ����ij�'nasm.exe'��) ��������NASMװ���ˡ��㲻��ҪΪ������nasm����'nasm'Ŀ¼һֱ����(��������� �ӵ������'PATH'��,�����������Ҫ��ʡ�ռ䣬���ɾ����,���ǣ��������Ҫ���� �ĵ�����Գ��� �����������DOS���Դ�����'nasmXXXs.zip',��'nasm'Ŀ¼�������������NASMԴ ���룬�����ѡ��һ��Makefiles�����¹������NASM�汾�� ע��Դ�ļ�`insnsa.c', `insnsd.c', `insnsi.h'��`insnsn.c'����'standard.mac'�� ��ָ���Զ����ɵģ�����NASM0.98�������а�������Щ�������ļ���������Ķ��� insns.dat,standard.mac�����ļ���������Ҫ���¹������ǣ��ڽ�����Դ�뷢������ ���ܽ����ٰ�����Щ�ļ�����ƽ̨���ݵ�Perl���Դ�www.cpan.org�ϵõ��� 1.3.2 ��unix�°�װNASM �����õ���Unix�µ�NASMԴ���'nasm-x.xx.tar.gz'(����x.xx��ʾ��Դ����е� nasm�İ汾��),������ѹѹ��һ��Ŀ¼������'/usr/local/src'��������ѹ��ᴴ�� �Լ�����Ŀ¼'nasm-x.xx' NASM��һ���Զ����õİ�װ��:һ�����ѹ������'cd'������Ŀ¼�£�����'./configuer', �ýű����ҵ���õ�C������������NASM�����ݴ˽���Makefiles�� һ��NASM���Զ����úú����������'make'������'nasm'��'ndisasm'�������ļ��� Ȼ������'make install'�����ǰ�װ��'/usr/local/bin',����manҳ��װ�� '/usr/local/man/man1'�µ�'nasm.1��'ndisasm.1'��������Ը����ýű�һ�� '--prefix'ѡ����ָ����װĿ¼������Ҳ�����Լ�����װ�� NASM������һ�״���'RDOFF'Ŀ���ļ���ʽ��ʵ�ó���������'rdoff'��Ŀ¼�£� �������'make rdf'���������ǣ���ʹ��'make rdf_install'����װ��������� Ҫ�Ļ��� ���NASM���Զ����õ�ʱ��ʧ���ˣ��㻹�ǿ���ʹ���ļ�'Makefile.unx'���������ǣ� ������ļ�����Ϊ'Makefile',Ȼ������'make'����'rdoff'��Ŀ¼��ͬ����һ�� Makefile.unx�ļ��� �ڶ��� ����NASM ----------------------- 2.1 NASM�������﷨ Ҫ���һ���ļ��������������ĸ�ʽִ��һ����� nasm -f [-o ] ����, nasm -f elf myfile.asm ����ļ�'myfile.asm'����'ELF'��ʽ ���ļ�'myfile.o'.���У� nasm -f bin myfile.asm -o myfile.com ����ļ�'myfile.asm'���ɴ������Ƹ�ʽ���ļ�'myfile.com'�� ��Ҫ��ʮ�����ƴ������ʽ�����б��ļ���������ô�����ʾ��Դ�������࣬ ʹ��'-l'ѡ������б��ļ��������磺 nasm -f coff myfile.asm -l myfile.lst ��Ҫ��ȡ����Ĺ���NASM��ʹ����Ϣ�������룺 nasm -h ��ͬʱ�����������ʹ�õ�����ļ���ʽ�� �����ʹ��Linux���Ҳ�������ϵͳ��'a.out'����'ELF'�������룺 file nasm (��nasm�������ļ��İ�װĿ¼��ʹ��),���ϵͳ��������������Ϣ�� nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1 ��ô���ϵͳ����'ELF'��ʽ�ģ�Ȼ�����Ӧ���ڲ���LinuxĿ���ļ�ʱʹ��ѡ ��'-f elf',���ϵͳ���������������Ϣ�� nasm: Linux/i386 demand-paged executable (QMAGIC) ����������Ƶģ����ϵͳ��'a.out'�ģ�����Ӧ��ʹ��'-f aout'(Linux��'a.out' ϵͳ�ܾ���ǰ�͹�ʱ�ˣ������ѷdz��ټ���) ����������Unix��������������NASM������������ǰ�Dz�����κ���Ϣ�ģ��� �Գ��˳�����Ϣ�㿴�����κ�������Ϣ�� 2.1.1 '-o'ѡ�ָ������ļ����ļ����� NASM��Ϊ�������ļ�ѡ��һ���ļ��������������ȡ����Ŀ���ļ��ĸ�ʽ���� ��΢����Ŀ���ļ���ʽ('obj'��'win32'),����ȥ�����Դ�ļ�����'.asm'��չ ��(���������κ���ϲ��ʹ�õ���չ����NASM�������ľ�����ʲô)�����滻�� 'obj'������Unix��Ŀ���ļ���ʽ('aout','coff','elf'��'as86')�����滻�� '.o', ����'rdf',����ʹ��'.rdf',����Ϊ'bin'��ʽ������򵥵�ȥ����չ�������� 'myfile.asm'�������һ������ļ�'myfile'�� �������ļ��Ѿ����ڣ�NASM�Ḳ���������������ļ����������ļ�ͬ���������� ����£��������һ��������Ϣ����ʹ��'nasm.out'��Ϊ����ļ����ļ����� ��ijЩ����£�������Ϊ�Dz��ܽ��ܵģ����ԣ�NASM�ṩ��'-o'ѡ���������ָ�� �������ļ����ļ�������ʹ��'-o'���������Ϊ����ļ�ȡ�����֣��м���Լ� �ո�Ҳ���Բ��ӡ����磺 nasm -f bin program.asm -o program.com nasm -f bin driver.asm -odriver.sys ��ע������һ��Сд��o������д��ĸO�Dz�ͬ�ģ���д��������ָ����Ҫ���ݵ�ѡ �����Ŀ�������2.1.15 2.1.2 `-f'ѡ�ָ������ļ��ĸ�ʽ�� �����û�ж�NASMʹ��'-f'ѡ������Լ�Ϊ��ѡ��һ������ļ���ʽ���ڷ����� NASM�汾�У�ȱʡ�������ʽ����'bin';������Լ��������NASM,������ڱ���� ʱ���ض���'OF_DEFAULT'��ѡ������Ҫ��ȱʡ��ʽ�� ����'-o','-f'������ļ���ʽ֮��Ŀո�Ҳ�ǿ�ѡ�ģ�����'-f elf'��'-felf'���� �Ϸ��ġ� ���п�ʹ�õ�����ļ���ʽ���б�����ͨ����������'nasm -hf'�õ��� 2.1.3 `-l' ѡ��: �����б��ļ� ������NASMʹ����'-l'ѡ������һ���ļ�����NASM��Ϊ�����һ��Դ�ļ����б� �ļ�,�����棬��ַ�Ͳ����Ĵ���������ߣ�ʵ�ʵ�Դ����(��������չ��������Щָ�� ����Ҫ���б�����չ�ĺ꣬����4.3.9)�����ұߣ����磺 nasm -f elf myfile.asm -l myfile.lst 2.1.4 `-M'ѡ��: ����Makefile������ϵ. ��ѡ������������׼�������makefile������ϵ�����԰���Щ��Ϣ�ض���һ���ļ� ���Դ���һ�����������磺 NASM -M myfile.asm > myfile.dep 2.1.5 `-F'ѡ��: ѡ��һ�����Ը�ʽ ��ѡ���������Ϊ����ļ�ѡ��һ�����Ը�ʽ���﷨��-fѡ����ᣬΨһ��ͬ�������� ��������ļ��ǵ��Ը�ʽ�ġ� һ�������ļ���ʽ�������Ŀ�ʹ�õ����ļ���ʽ���б���ͨ������'nasm -f -y' ���õ��� ���ѡ����ȱʡ״̬��û�б�����ʱNASM�����ʹ�ø�ѡ�����Ϣ�����6.10 2.1.6 `-g' ѡ��:ʹ������Ϣ��Ч�� ��ѡ���������ָ����ʽ������ļ��в���������Ϣ�� �������Ϣ�����2.1.5 2.1.7 `-E' ѡ��: �Ѵ�����Ϣ���뵽�ļ��� ��'MS-DOS'�£������а취����Ҫ�ѳ���ı�׼��������ض���һ���ļ����Ƿdz��� �ѵġ���ΪNASM�������ľ���ʹ�����Ϣ�������׼�����豸���⽫���������ı��� ����������Ѳ�׽�����ǡ� ���NASM�ṩ��һ��'-E'ѡ�����һ���ļ��������������԰Ѵ�����Ϣ�����ָ���� �ļ������DZ�׼�����豸��������������������������������Ѵ����ض����ļ��� nasm -E myfile.err -f obj myfile.asm 2.1.8 `-s' ѡ��: �Ѵ�����Ϣ�����'stdout' '-s'ѡ����԰Ѵ�����Ϣ�ض���'stdout'������'stderr'����������'MS-DOS'�½��� �ض�����Ҫ�ڻ���ļ�'myfile.asm'ʱ����������ùܵ������'more'���򣬿��������� nasm -s -f obj myfile.asm | more ��ο�2.1.7��'-E'ѡ��. 2.1.9 `-i'ѡ��: �����ļ�����·�� ��NASM��Դ�ļ��п���'%include'������ʱ(����4.6)�������������ڵ�ǰĿ¼�������� �����ļ�����������'-i'ѡ������������ָ��������·������������ԴӺ궨����� ������һ���ļ������磬���룺 nasm -ic:\macrolib\ -f obj myfile.asm (ͨ������ '-i'��·����֮��Ŀո��������ģ����ҿ�ѡ�ġ�) NASM����Ĺ�עԴ���뼶�ϵ���ȫ����ֲ�ԣ����Բ������������еIJ���ϵͳ���ļ��� ����ϰ�ߣ����ṩ��'-i'��Ϊ�����ĵ��ַ����ᱻһ�ֲ���ؼ��ڰ����ļ����ļ���ǰ�� ���ԣ�������������һ����б���DZ�Ҫ�ģ���Unix�£�һ��β������б��Ҳͬ���DZ�Ҫ�ġ� (��Ȼ�������ȷʵ��Ҫ����Ҳ���Բ������ʹ���������磬ѡ��'-ifoo'�ᵼ�� '%incldue "bar.i'ȥ�����ļ�'foobar.i'...) �����ϣ������һ����׼������·����������Unixϵͳ�µ�'/usr/include'��������ڻ��� ����NASMENV�з���һ������'-i'(����2.1.19) Ϊ����������C��������Makefile���ּ��ݣ���ѡ��Ҳ���Ա�д��'-I'�� 2.1.10 `-p' ѡ��: Ԥ����һ���ļ� NASM������ͨ��'-p'ѡ����ָ��һ���ļ�Ԥ���������Դ�ļ������ԣ�������У� nasm myfile.asm -p myinc.inc ����Դ�ļ���ͷд��'%include "myinc.inc"Ȼ������'nasm myfile.asm'�ǵ�Ч�ġ� Ϊ��'-I','-D','-U'ѡ��ٳ�һ���ԣ���ѡ��Ҳ���Ա�д��'-P' 2.1.11 `-d'ѡ��: Ԥ����һ���ꡣ ����'-p'ѡ����������ļ�ͷ����'%include'����һ��ʵ�֣�'-d'ѡ����������� ����д'%define'����һ��ʵ�֣������д�� nasm myfile.asm -dFOO=100 ��Ϊ���ļ���д����һ������һ�����ʵ�֣� %define FOO 100 ���ļ��Ŀ�ʼ�������ȡ��һ���궨�壬ͬ����ѡ��'-dFOO'��ͬ�ڴ���'%define FOO'�� ������ʽ�IJ�������ѡ�����ʱ�����зdz����ã����ǿ�����'%ifdef'�����в��ԣ� ����'-dDEBUG'�� Ϊ����������C��������Makefile���ּ��ݣ���ѡ��Ҳ���Ա�д��'-D'�� 2.1.12 `-u' ѡ��: ȡ��һ���궨�塣 '-u'ѡ���������ȡ��һ����'-p'��'-d'ѡ����ǰ���������϶����һ���궨�塣 ���磬�����������䣺 nasm myfile.asm -dFOO=100 -uFOO �ᵼ��'FOO'����һ���ڳ�����Ԥ����ĺꡣ����Makefile�в�ͬλ������һ���� ��ʱ�����á� Ϊ����������C��������Makefile���ּ��ݣ���ѡ��Ҳ���Ա�д��'-U'�� 2.1.13 `-e'ѡ��: ��Ԥ������ NASM����Ԥ�������������С�ʹ��'-e'ѡ��(����Ҫ����)�ᵼ��NASMԤ�������� �ļ���չ�����еĺ꣬ȥ�����е�ע�ͺ�Ԥ������������Ȼ��ѽ���ļ���ӡ�ڱ� ׼�����(���'-o'ѡ��Ҳ��ָ���Ļ����ᱻ����һ���ļ�)�� ��ѡ��ܱ�������Щ��ҪԤ������ȥ�����������صı���ʽ�ij����У����� ������Ĵ��룺 %assign tablesize ($-tablestart) ���ڽ�Ԥ����ģʽ�л������ 2.1.14 `-a' ѡ��: ����ҪԤ������ ���NASM�������������ĺ�̨����ô����������Ѿ�������Ԥ����������ֹNASM��Ԥ ����������Ȼ�ǿ��Խ�Լʱ�䣬�ӿ�����ٶȡ�'-a'ѡ��(����Ҫ����)������NASM�� ��ǿ���Ԥ������������һ��ʲôҲ������Ԥ�������� 2.1.15 `-On'ѡ��: ָ������Ż��� NASM��ȱʡ״̬����һ������Ļ����������ζ���������һ�����ӵ�Դ�ļ���Ҫ ��������Ļ�ࡣ������������ ʹ��'-O'ѡ�����Ը���NASMִ�ж���ࡣ�﷨���£� (*)'-O0'�ϸ�ִ�������Ż���JMP��Jcc�Ĵ�����0.98�����ƣ������������JMP�Ƕ��� ת��������ܣ������������ǵĶ̸�ʽû�б�ָ���������ʹ�ó���ʽ�� (*)'-O1'�ϸ�ִ�������Ż�����ǰ���֧�����ɱ�֤�ܹ�����Ĵ��룻���ܲ����� '-O0'����Ĵ��룬���ڷ�֧�е�ƫ�Ƶ�ַû��ָ��������»��ɹ��Ļ��ʸ��� (*)'-On' ����Ż�����С����֧��ƫ�ƣ���С�������ŵ�����������'strict'�ؼ��� û���õ�ʱ������ָ���Ĵ�С(����3.7)�����2<=n<=3������5*n��,������n�顣 ע������һ����д��O����Сд��o�Dz�ͬ�ģ�Сд��o��ָ������ļ��ĸ�ʽ���ɲ��� 2.1.1 2.1.16 `-t'ѡ��: ʹ��TASM����ģʽ�� NASM��һ����Borlands��TASM֮������޵ļ��ݸ�ʽ�����ʹ����NASM��'-t'ѡ� �ͻ�������б仯�� (*)���ط��ŵ�ǰ׺��'.'��Ϊ'@@' (*)TASM������'@'��ͷ��Ӧ���ļ�������������ָ�������NASM֧�ֵ�'-@resp' ����Dz�ͬ�ġ� (*)�����еijߴ��滻��֧�֡���TASM����ģʽ�У��������еijߴ��滻�ı��˲��� ���ijߴ��С�������Ų���֧��NASM�﷨�IJ�������ַ�����磬'mov eax,[DWORD VAL]' ��TASM�����﷨���ǺϷ��ġ���ע����ʧȥ��Ϊָ���滻ȱʡ��ַ���͵������� (*)'%arg'Ԥ������������֧�֣���ͬTASM��ARG���������ơ� (*) `%local'Ԥ������������ (*) `%stacksize'Ԥ������������ (*) ijЩ����������ǰ׺��ʽ��֧�֡� (`arg', `elif',`else', `endif', `if', `ifdef', `ifdifi', `ifndef', `include',`local') (*) ���кܶ�... ��Ҫ����Ĺ��ڲ���������Ϣ�������4.9��TASM����Ԥ����������ָ� 2.1.17 `-w'ѡ��: ʹ��ྯ����Ϣ��Ч����Ч�� NASM�����ڻ������м��Ӻܶ����������кܶ���ֵ�÷������û��ģ�����Щ��� �������Թ������ش�����ʹNASMֹͣ��������ļ�����Щ����������ƴ������ʽ ������û������ڱ�����Ϣ��ǰ�����'warning'������������Ϣ������ֹNASM���� ����ļ��������ϵͳ���سɹ���Ϣ�� ��Щ���������Ҫ���ɣ����ǽ�����һЩֵ���ṩ���û�����Ϣ�����ԣ�NASM֧��'-w' ������ѡ�����ʹ�ض����͵Ļ�ྯ����Ϣ�����Ч����Ч�������ľ��������� �������������ģ����磬'orphan-labels'������������е�������ѡ���ô��ྯ����Ϣ ���������'-w+orphan-labels'��������'-w-orphan-labels'�ô�����Ϣ��������� �ɽ�ֹ�ľ�����Ϣ����������һЩ�� (*)`macro-params'�����Դ���IJ����������ö��еĺ궨��ľ��档���ྯ����Ϣ ȱʡ�����������ģ�����Ϊʲô�������Ҫ��ֹ���������4.3.1�� (*)`orphan-labels'����Դ�ļ�����û��ָ��ȴ������һ��û�н�β�ֺŵ�label�� ���档ȱʡ״���£�NASM��������ྯ�档�������Ҫ���������3.1�����ӡ� (*) 'number-overflow'������Щ��ֵ����������32λ��ʽ������Ϣ�����磬������״� �˺ܶ��F�����������'0x7fffffffffff'�������־�����Ϣȱʡ״�����Ǵ򿪵ġ� 2.1.18 `-v'ѡ��: ��ӡ�汾��Ϣ�� ����'NASM -v'����ʾ����ʹ�õ�NASM�İ汾�ţ��������������ʱ�䡣 �����Ҫ�ύbug���棬�������Ҫ�汾�š� 2.1.19 `NASMENV'���������� ����㶨����һ����'NASMENV'�Ļ�������������ᱻ����������������ѡ��ӵ�һ ���֣�������������������֮ǰ�������������ͨ����'NASMENV'��ʹ��'-i'ѡ������ ������ļ��ı�׼����·���� ����������ֵ��ͨ���ո���ָ��ģ�����ֵ'-s ic:\nasmlib'�ᱻ�������������IJ� ����Ҳ����Ϊ��ˣ���ζ��ֵ'-dNAME='my name'��������Ԥ�ڵ�����������, ��Ϊ�� ���ڿո�������ֿ���NASM�������д����ᱻ����û��������ַ���'-dNAME="my'�� 'name"'��Ū�졣 Ϊ�˽��������⣬NASMΪ���ṩ��һ�����ԣ��������'NASMENV'���������ĵ�һ�� �ַ���д��һ���Ǽ����ַ���NASM�ͻ������ַ�������ѡ��ķָ��������԰ѻ� ���������'!-s!-ic:\nasmlib'��'-s -ic:\nasmlib'ûʲô���������� '!-dNAME="my name"�ͻ����������ˡ� �������������ǰ����'NASM',�Ӱ汾0.98.32�Ժ�ʼ��������֡� 2.2 MASM�û��ٳɡ� �������ʹ��MASMд���򣬻���ʹ����MASM����ģʽ��ʹ��TASM, ����ʹ��'a86'�� ���ڽ�����MASM��NASM�﷨֮�����Ҫ���������û��ʹ�ù�MASM��������� ������һ�ڡ� 2.2.1 NASM�Ǵ�Сд���еġ� һ���򵥵�������NASM�Ǵ�Сд���еġ����������ķ���'foo','Foo',�� 'FOO'ʱ�������Dz�ͬ�ġ�������ڻ��'DOS'��'OS/2', '.OBJ'�ļ��������ʹ ��'UPPERCASE'����������֤���еĵ�������������ģʽ�ķ��Ŷ��Ǵ�д�ģ��� �ǣ��ڽ���һ��������ģ���У�NASM�����ִ�Сд�����顣 2.2.2 NASM��Ҫ�������������ڴ��ַ�� NASM�����˼�����﷨�����ܼ�ࡣ����һ�����Ŀ���ǣ������ڱ�ʹ�õĹ��� �У������ܵ����û�����һ�����е�NASM����ʱ���Ϳ���˵���������ʲô���� �롣�������NASM�������������磬����������ˣ� foo equ 1 bar dw 2 Ȼ�������еĴ��룺 mov ax,foo mov ax,bar ���������п���ȥ��ȫ��ͬ���﷨����ȴ��������ȫ��ͬ�IJ����� NASMΪ�˱���������������������ӵ��һ���൱�򵥵��ڴ�������δ�ܡ����� ���κζ��ڴ������ݵĴ�ȡ��������Ҫ�ڵ�ַ�ϼ��Ϸ����š����κζԵ�ֵַ �IJ�������Ҫ�����ԣ�����'mov ax,foo'��ָ�����Ǵ���һ������ʱ������������ ��һ�� 'EQU'��һ�������ĵ�ַ�����Ҫȡ����'bar'�����ݣ�������� 'mov ax,[bar]'�� ��Ҳ��ζ��NASM����ҪMASM��'OFFSET'�ؼ��֣���ΪMASM�Ĵ���'mov ax,offset bar' ͬNASM���﷨'mov ax,bar'����ȫ��Ч�ġ������ϣ���ô�����MASM�����ܹ��� NASM���ͨ��������Ա�д'%idefine offset'��Ԥ��������'OFFSET'������һ���� �������� ���������'a86'�о͸������ˡ� NASM��Ϊ��ע����ԣ�ͬ����֧��MASM������������Ʒ֧�ֵĵĻ���﷨�������� :'mov ax, table[bx]',���һ����������IJ��ּ��������ڵ�һ����������һ�� �ڴ��ַ������������ȷ�﷨�ǣ�'mov ax,[table+bx] ��ͬ����'mov ax,es:[di]' Ҳ�Ǵ���ģ���ȷ��Ӧ����'mov ax,[es:di]'�� 2.2.3 NASM���洢���������͡� NASM����Ƴɲ���ס�������ı��������͡�Ȼ����MASM�ڿ���'var dw 0'ʱ���ס ���ͣ�Ȼ��Ϳ�����ʽ�غ���'mov var, 2'��������ֵ��NASM�����ס���ڱ��� 'var'���κζ�������������λ�ã������������ʽ��д�ϴ���'mov word [var],2'�� ��Ϊ���ԭ��NASM��֧��'LODS','MOVS','STOS','SCANS','CMPS','INS',��'OUTS' ָ�����֧������'LODSB','MOVSW',��'SCANSD'֮�ҵ�ָ����Ƕ���ʽ��ָ�� ���������ַ����ijߴ硣 2.2.4 NASM���� `ASSUME' ��ΪNASM����Ե�һ���֣���ͬ����֧��'ASSUME'��������NASM�����ס�����μ� ���������ʲôֵ��Ҳ�����Զ��������滻ǰ׺�� 2.2.5 NASM��֧���ڴ�ģ�͡� NASMͬ���������κβ�������֧�ֲ�ͬ��16λ�ڴ�ģ�͡�����Ա��Ҫ�Լ������� Щ������Ҫfar call����Щ��Ҫnear call������Ҫȷ��������ȷ��'RET'ָ��('RETN' ��'RETF'; NASM����'RET'��Ϊ'RETN'����һ����ʽ);�������Ա��Ҫ�ڵ����ⲿ�� ��ʱ����Ҫ�ı�дCALL FARָ������������Щ�ⲿ����������far,��Щ��near�� 2.2.6 ���㴦���ϵIJ�ͬ�� NASMʹ�ø�MASM��ͬ�ĸ���Ĵ�������MASM������'ST(0)','ST(1)'�ȣ���'a86'������ '0','1'�ȣ�NASM�������'st0','st1'�ȡ� �ڰ汾0.96�ϣ�NASM�����Ը�MASM���ݻ����ͬ���ķ�ʽ����'nowait'��ʽ��ָ� 0.95�Լ�����İ汾�ϵIJ�ͬ�Ĵ�����ʽ��Ҫ����Ϊ���ߵ���⡣ 2.2.7 ������ͬ�� ������ʷ��ԭ��NASM��MASM���ݻ������'TBYTE'д��'TWORD'�� NASM�Ը�MASM��ͬ��һ�ַ�ʽ����δ��ʼ�����ڴ档MASM�ij���Ա����ʹ�� 'stack db 64 dup (?)', NASM��Ҫ����д��'stack resb 64',����"����64�ֽ�"��Ϊ�� ���ֿ���ֲ�ԣ�NASM��'?'�����Ƿ��������е�һ����Ч���ַ�����������Ա�д���� �Ĵ���'? equ 0', Ȼ��д'dw ?'������һЩ���õ����顣'DUP'����һ������֧�ֵ��﷨�� ���⣬����������Ĺ�����ʽҲ��MASM��ȫ��ͬ�����Ե����ĵ�4����5�¡� ������ NASM���� ---------------- 3.1 NASMԴ�����е���ɡ� ����ܶ������Ļ������ÿһ��NASMԴ�������(��������һ���꣬һ��Ԥ�������� ������һ����������������ο���4��5��)�����ĸ����ֵ�ȫ����ij�������֣� label: instruction operands ; comment ͨ������Щ��Ĵ󲿷��ǿ�ѡ�ģ�label,instruction,comment���ڻ򲻴��ڶ����� ���ġ���Ȼ��operands�����Ϊinstruction���Ҫ�����������벻���ڡ� NASMʹ�÷�б��(\)��Ϊ���з������һ����һ����б�߽������ǵڶ��лᱻ��Ϊ ��ǰ��һ�е�һ���֡� NASM����һ���еĿո����û���ϸ�����ƣ�labels���������ǵ�ǰ���пո񣬻� �����κζ�����label�����ð��ͬ��Ҳ�ǿ�ѡ�ġ�(ע�⵽������ζ��������� Ҫдһ��'lodsb'����ȴ�����д����'lodab'�����Խ�����Ч��һ�У�����һ�в��� �κ����飬ֻ�Ƕ�����һ��label������NASMʱ����������ѡ��'-w+orphan-labels' ����NASM���㶨����һ������ð�Ž�β��labelʱ�����㡣 labels�е���Ч���ַ�����ĸ�����֣�'-','$','#','@','~','.'��'?'����ֻ����ĸ '.',(�������⺬�壬����3.9),'_'��'?'������Ϊ��ʶ���Ŀ�ͷ��һ����ʶ������ �Լ���һ��'$'ǰ׺���Ա���������Ϊһ����ʶ�������DZ������������������Ļ��� ������뵽���ӽ���������ģ���ж�����һ�����Ž�'eax'���������'$eax'�� NASM���������������ԺͼĴ����ķ������ֿ��� instruction����԰����κλ���ָ�Pentium��P6ָ�FPUָ�MMXָ����� ��û�й�����ָ��Ҳ�ᱻ֧�֡���Щָ����Լ���ǰ׺'LOCK','REP','REPE/REPZ' ��'REPNE'/'REPNZ'��ͨ����֧����ʾ�ĵ�ַ�ߴ�Ͳ������ߴ�ǰ׺'A16','A32', 'O16'��'O32'������ʹ�����ǵ�һ�������ڵھ��¸�������Ҳ����ʹ�öμĴ��� ����Ϊָ��ǰ׺�� ����'es mov [bx],ax'��Ч�ڴ���'mov [es:bx],ax'�������Ƽ� ��һ���﷨����Ϊ�����﷨�е������﷨����һ�¡����Ƕ�����'LODSB'������ ָ���û�в������������ǿ�����һ����ǰ׺�� ����'es lodsb'û���������﷨ ������ʽ ��ʹ��һ��ǰ׺ʱ��ָ��DZ���ģ���'CS','A32','LOCK'��'REPE'�����Ķ�ǰ׺ ���Ե���������һ���ϣ�NASM��������һ��ǰ׺�ֽڡ� ��Ϊ��ʵ�ʻ���ָ�����չ��NASMͬʱ�ṩ��һ��������α����ָ�����3.2�� ��ϸ������ ָ�����������ʹ��һ���ĸ�ʽ�����ǿ����ǼĴ����������ԼĴ���������ʾ(�� �磺'ax','bp','ebx','cr0'��NASM��ʹ��'gas'���﷨��������ַ���У��Ĵ����� ǰ�������һ��'%'����)���������ǿ�������Ч�ĵ�ַ(����3.3)������(3.4)���� ����ʽ�� ���ڸ���ָ�NASM���ܸ����﷨�������ʹ��MASM֧�ֵ�˫��������ʽ�������� ����ʹ��NASM���ڴ���������ȫ�õĵ���������ʽ��֧�ֵ�����ָ����﷨ ϸ�ڿ��Բ��ĸ�¼B�����磬�����д�� fadd st1 ; this sets st0 := st0 + st1 fadd st0,st1 ; so does this fadd st1,st0 ; this sets st1 := st1 + st0 fadd to st1 ; so does this �������еĸ���ָ���������ڴ�ʱ����ʹ������ǰ׺�е�һ��'DWORD',QWORD' ��'TWORD'��ָ���������õ��ڴ�ijߴ硣 3.2 αָ� αָ����һЩ������������x86����ָ������DZ�������instruction���е�ָ ���Ϊʹ�����ǿ��Դ����ܴ�ķ��㡣��ǰ��αָ����'DB','DW','DD','DQ'�� ��DT�������Ƕ�Ӧ��δ��ʼ��ָ����'RESB','RESW','RESD','RESQ'��'REST'��'INCBIN' ���'EQU'�����'TIEMS'ǰ׺�� 3.2.1 `DB'һ���αָ��: �����ѳ�ʼ�������ݡ� ��NASM�У�`DB', `DW', `DD', `DQ'��`DT'����������������ļ��������ѳ�ʼ�� �����ݣ�����Զ��ַ�ʽʹ�����ǣ� db 0x55 ; just the byte 0x55 db 0x55,0x56,0x57 ; three bytes in succession db 'a',0x55 ; character constants are OK db 'hello',13,10,'$' ; so are string constants dw 0x1234 ; 0x34 0x12 dw 'a' ; 0x41 0x00 (it's just a number) dw 'ab' ; 0x41 0x42 (character constant) dw 'abc' ; 0x41 0x42 0x43 0x00 (string) dd 0x12345678 ; 0x78 0x56 0x34 0x12 dd 1.234567e20 ; floating-point constant dq 1.234567e20 ; double-precision float dt 1.234567e20 ; extended-precision float 'DQ'��'DT'��������ֵ�������ַ���������Ϊ�������� 3.2.2 `RESB'���αָ��: ����δ��ʼ�������ݡ� `RESB', `RESW', `RESD', `RESQ' and `REST'���������ģ���BSS���У��������� δ��ʼ���Ĵ洢�ռ䡣ÿһ�����е��������������������ֽ�������������˫���� ����������Ҫ������λ��������2.2.7���������ģ�NASM��֧��MASM/TASM�Ŀ���δ ��ʼ���ռ���﷨'DW ?'�����ƵĶ�������������������������NASM�Լ��ķ�ʽ�� 'RESB'��αָ��IJ����������ϸ���﷨�ģ�����3.8�� ���磺 buffer: resb 64 ; reserve 64 bytes wordvar: resw 1 ; reserve a word realarray resq 10 ; array of ten reals 3.2.3 `INCBIN':���������������ļ��� 'INCBIN'�Ǵ��ϵ�Amiga�����DevPac�н�����ģ�����һ���������ļ��������� ����������ļ��С����ܷܺ������һ����Ϸ��ִ���ļ��а�����ͼ��������� �ݡ�����������������ʽ���κ�һ��ʹ�ã� incbin "file.dat" ; include the whole file incbin "file.dat",1024 ; skip the first 1024 bytes incbin "file.dat",1024,512 ; skip the first 1024, and ; actually include at most 512 3.2.4 `EQU': ���峣���� 'EQU'����һ�����ţ�����һ������ֵ����ʹ��'EQU'ʱ��Դ�ļ����ϱ������һ��label�� 'EQU'����Ϊ���ǰѸ�����label�����ֶ�������IJ�����(Ψһ)��ֵ�������Dz��ɸ� �ĵģ����磺 message db 'hello, world' msglen equ $-message ��'msglen'������˳���12��'msglen'�����ٱ��ض��塣��Ҳ����һ��Ԥ�������壺 'msglen'��ֵֻ������һ�Σ�������ʹ�õ���'$'(����3.5)�ڴ�ʱ�ĺ��塣ע�� ��EQU���IJ�����Ҳ��һ���ϸ��﷨�ı���ʽ��(����3.8) 3.2.5 `TIMES': �ظ�ָ������ݡ� Ϊ����������C��������Makefile���ּ��ݣ���ѡ��Ҳ���Ա�д��'-U'�� 2.1.13 `-e'ѡ��: ��Ԥ������ NASM����Ԥ�������������С�ʹ��'-e'ѡ��(����Ҫ����)�ᵼ��NASMԤ�������� �ļ���չ�����еĺ꣬ȥ�����е�ע�ͺ�Ԥ������������Ȼ��ѽ���ļ���ӡ�ڱ� ׼�����(���'-o'ѡ��Ҳ��ָ���Ļ����ᱻ����һ���ļ�)�� ��ѡ��ܱ�������Щ��ҪԤ������ȥ�����������صı���ʽ�ij����У����� ������Ĵ��룺 %assign tablesize ($-tablestart) ���ڽ�Ԥ����ģʽ�л������ 2.1.14 `-a' ѡ��: ����ҪԤ������ ���NASM�������������ĺ�̨����ô����������Ѿ�������Ԥ����������ֹNASM��Ԥ ����������Ȼ�ǿ��Խ�Լʱ�䣬�ӿ�����ٶȡ�'-a'ѡ��(����Ҫ����)������NASM�� ��ǿ���Ԥ������������һ��ʲôҲ������Ԥ�������� 2.1.15 `-On'ѡ��: ָ������Ż��� NASM��ȱʡ״̬����һ������Ļ����������ζ���������һ�����ӵ�Դ�ļ���Ҫ ��������Ļ�ࡣ������������ ʹ��'-O'ѡ�����Ը���NASMִ�ж���ࡣ�﷨���£� (*)'-O0'�ϸ�ִ�������Ż���JMP��Jcc�Ĵ�����0.98�����ƣ������������JMP�Ƕ��� ת��������ܣ������������ǵĶ̸�ʽû�б�ָ���������ʹ�ó���ʽ�� (*)'-O1'�ϸ�ִ�������Ż�����ǰ���֧�����ɱ�֤�ܹ�����Ĵ��룻���ܲ����� '-O0'����Ĵ��룬���ڷ�֧�е�ƫ�Ƶ�ַû��ָ��������»��ɹ��Ļ��ʸ��� (*)'-On' ����Ż�����С����֧��ƫ�ƣ���С�������ŵ�����������'strict'�ؼ��� û���õ�ʱ������ָ���Ĵ�С(����3.7)�����2<=n<=3������5*n��,������n�顣 ע������һ����д��O����Сд��o�Dz�ͬ�ģ�Сд��o��ָ������ļ��ĸ�ʽ���ɲ��� 2.1.1 2.1.16 `-t'ѡ��: ʹ��TASM����ģʽ�� NASM��һ����Borlands��TASM֮������޵ļ��ݸ�ʽ�����ʹ����NASM��'-t'ѡ� �ͻ�������б仯�� (*)���ط��ŵ�ǰ׺��'.'��Ϊ'@@' (*)TASM������'@'��ͷ��Ӧ���ļ�������������ָ�������NASM֧�ֵ�'-@resp' ����Dz�ͬ�ġ� (*)�����еijߴ��滻��֧�֡���TASM����ģʽ�У��������еijߴ��滻�ı��˲��� ���ijߴ��С�������Ų���֧��NASM�﷨�IJ�������ַ�����磬'mov eax,[DWORD VAL]' ��TASM�����﷨���ǺϷ��ġ���ע����ʧȥ��Ϊָ���滻ȱʡ��ַ���͵������� (*)'%arg'Ԥ������������֧�֣���ͬTASM��ARG���������ơ� (*) `%local'Ԥ������������ (*) `%stacksize'Ԥ������������ (*) ijЩ����������ǰ׺��ʽ��֧�֡� (`arg', `elif',`else', `endif', `if', `ifdef', `ifdifi', `ifndef', `include',`local') (*) ���кܶ�... ��Ҫ����Ĺ��ڲ���������Ϣ�������4.9��TASM����Ԥ����������ָ� 2.1.17 `-w'ѡ��: ʹ��ྯ����Ϣ��Ч����Ч�� NASM�����ڻ������м��Ӻܶ����������кܶ���ֵ�÷������û��ģ�����Щ��� �������Թ������ش�����ʹNASMֹͣ��������ļ�����Щ����������ƴ������ʽ ������û������ڱ�����Ϣ��ǰ�����'warning'������������Ϣ������ֹNASM���� ����ļ��������ϵͳ���سɹ���Ϣ�� ��Щ���������Ҫ���ɣ����ǽ�����һЩֵ���ṩ���û�����Ϣ�����ԣ�NASM֧��'-w' ������ѡ�����ʹ�ض����͵Ļ�ྯ����Ϣ�����Ч����Ч�������ľ��������� �������������ģ����磬'orphan-labels'������������е�������ѡ���ô��ྯ����Ϣ ���������'-w+orphan-labels'��������'-w-orphan-labels'�ô�����Ϣ��������� �ɽ�ֹ�ľ�����Ϣ����������һЩ�� (*)`macro-params'�����Դ���IJ����������ö��еĺ궨��ľ��档���ྯ����Ϣ ȱʡ�����������ģ�����Ϊʲô�������Ҫ��ֹ���������4.3.1�� (*)`orphan-labels'����Դ�ļ�����û��ָ��ȴ������һ��û�н�β�ֺŵ�label�� ���档ȱʡ״���£�NASM��������ྯ�档�������Ҫ���������3.1�����ӡ� (*) 'number-overflow'������Щ��ֵ����������32λ��ʽ������Ϣ�����磬������״� �˺ܶ��F�����������'0x7fffffffffff'�������־�����Ϣȱʡ״�����Ǵ򿪵ġ� 2.1.18 `-v'ѡ��: ��ӡ�汾��Ϣ�� ����'NASM -v'����ʾ����ʹ�õ�NASM�İ汾�ţ��������������ʱ�䡣 �����Ҫ�ύbug���棬�������Ҫ�汾�š� 2.1.19 `NASMENV'���������� ����㶨����һ����'NASMENV'�Ļ�������������ᱻ����������������ѡ��ӵ�һ ���֣�������������������֮ǰ�������������ͨ����'NASMENV'��ʹ��'-i'ѡ������ ������ļ��ı�׼����·���� ����������ֵ��ͨ���ո���ָ��ģ�����ֵ'-s ic:\nasmlib'�ᱻ�������������IJ� ����Ҳ����Ϊ��ˣ���ζ��ֵ'-dNAME='my name'��������Ԥ�ڵ�����������, ��Ϊ�� ���ڿո�������ֿ���NASM�������д����ᱻ����û��������ַ���'-dNAME="my'�� 'name"'��Ū�졣 Ϊ�˽��������⣬NASMΪ���ṩ��һ�����ԣ��������'NASMENV'���������ĵ�һ�� �ַ���д��һ���Ǽ����ַ���NASM�ͻ������ַ�������ѡ��ķָ��������԰ѻ� ���������'!-s!-ic:\nasmlib'��'-s -ic:\nasmlib'ûʲô���������� '!-dNAME="my name"�ͻ����������ˡ� �������������ǰ����'NASM',�Ӱ汾0.98.32�Ժ�ʼ��������֡� 2.2 MASM�û��ٳɡ� �������ʹ��MASMд���򣬻���ʹ����MASM����ģʽ��ʹ��TASM, ����ʹ��'a86'�� ���ڽ�����MASM��NASM�﷨֮�����Ҫ���������û��ʹ�ù�MASM��������� ������һ�ڡ� 2.2.1 NASM�Ǵ�Сд���еġ� һ���򵥵�������NASM�Ǵ�Сд���еġ����������ķ���'foo','Foo',�� 'FOO'ʱ�������Dz�ͬ�ġ�������ڻ��'DOS'��'OS/2', '.OBJ'�ļ��������ʹ ��'UPPERCASE'����������֤���еĵ�������������ģʽ�ķ��Ŷ��Ǵ�д�ģ��� �ǣ��ڽ���һ��������ģ���У�NASM�����ִ�Сд�����顣 2.2.2 NASM��Ҫ�������������ڴ��ַ�� NASM�����˼�����﷨�����ܼ�ࡣ����һ�����Ŀ���ǣ������ڱ�ʹ�õĹ��� �У������ܵ����û�����һ�����е�NASM����ʱ���Ϳ���˵���������ʲô���� �롣�������NASM�������������磬����������ˣ� foo equ 1 bar dw 2 Ȼ�������еĴ��룺 mov ax,foo mov ax,bar ���������п���ȥ��ȫ��ͬ���﷨����ȴ��������ȫ��ͬ�IJ����� NASMΪ�˱���������������������ӵ��һ���൱�򵥵��ڴ�������δ�ܡ����� ���κζ��ڴ������ݵĴ�ȡ��������Ҫ�ڵ�ַ�ϼ��Ϸ����š����κζԵ�ֵַ �IJ�������Ҫ�����ԣ�����'mov ax,foo'��ָ�����Ǵ���һ������ʱ������������ ��һ�� 'EQU'��һ�������ĵ�ַ�����Ҫȡ����'bar'�����ݣ�������� 'mov ax,[bar]'�� ��Ҳ��ζ��NASM����ҪMASM��'OFFSET'�ؼ��֣���ΪMASM�Ĵ���'mov ax,offset bar' ͬNASM���﷨'mov ax,bar'����ȫ��Ч�ġ������ϣ���ô�����MASM�����ܹ��� NASM���ͨ��������Ա�д'%idefine offset'��Ԥ��������'OFFSET'������һ���� �������� ���������'a86'�о͸������ˡ� NASM��Ϊ��ע����ԣ�ͬ����֧��MASM������������Ʒ֧�ֵĵĻ���﷨�������� :'mov ax, table[bx]',���һ����������IJ��ּ��������ڵ�һ����������һ�� �ڴ��ַ������������ȷ�﷨�ǣ�'mov ax,[table+bx] ��ͬ����'mov ax,es:[di]' Ҳ�Ǵ���ģ���ȷ��Ӧ����'mov ax,[es:di]'�� 2.2.3 NASM���洢���������͡� NASM����Ƴɲ���ס�������ı��������͡�Ȼ����MASM�ڿ���'var dw 0'ʱ���ס ���ͣ�Ȼ��Ϳ�����ʽ�غ���'mov var, 2'��������ֵ��NASM�����ס���ڱ��� 'var'���κζ�������������λ�ã������������ʽ��д�ϴ���'mov word [var],2'�� ��Ϊ���ԭ��NASM��֧��'LODS','MOVS','STOS','SCANS','CMPS','INS',��'OUTS' ָ�����֧������'LODSB','MOVSW',��'SCANSD'֮�ҵ�ָ����Ƕ���ʽ��ָ�� ���������ַ����ijߴ硣 2.2.4 NASM���� `ASSUME' ��ΪNASM����Ե�һ���֣���ͬ����֧��'ASSUME'��������NASM�����ס�����μ� ���������ʲôֵ��Ҳ�����Զ��������滻ǰ׺�� 2.2.5 NASM��֧���ڴ�ģ�͡� NASMͬ���������κβ�������֧�ֲ�ͬ��16λ�ڴ�ģ�͡�����Ա��Ҫ�Լ������� Щ������Ҫfar call����Щ��Ҫnear call������Ҫȷ��������ȷ��'RET'ָ��('RETN' ��'RETF'; NASM����'RET'��Ϊ'RETN'����һ����ʽ);�������Ա��Ҫ�ڵ����ⲿ�� ��ʱ����Ҫ�ı�дCALL FARָ������������Щ�ⲿ����������far,��Щ��near�� 2.2.6 ���㴦���ϵIJ�ͬ�� NASMʹ�ø�MASM��ͬ�ĸ���Ĵ�������MASM������'ST(0)','ST(1)'�ȣ���'a86'������ '0','1'�ȣ�NASM�������'st0','st1'�ȡ� �ڰ汾0.96�ϣ�NASM�����Ը�MASM���ݻ����ͬ���ķ�ʽ����'nowait'��ʽ��ָ� 0.95�Լ�����İ汾�ϵIJ�ͬ�Ĵ�����ʽ��Ҫ����Ϊ���ߵ���⡣ 2.2.7 ������ͬ�� ������ʷ��ԭ��NASM��MASM���ݻ������'TBYTE'д��'TWORD'�� NASM�Ը�MASM��ͬ��һ�ַ�ʽ����δ��ʼ�����ڴ档MASM�ij���Ա����ʹ�� 'stack db 64 dup (?)', NASM��Ҫ����д��'stack resb 64',����"����64�ֽ�"��Ϊ�� ���ֿ���ֲ�ԣ�NASM��'?'�����Ƿ��������е�һ����Ч���ַ�����������Ա�д���� �Ĵ���'? equ 0', Ȼ��д'dw ?'������һЩ���õ����顣'DUP'����һ������֧�ֵ��﷨�� ���⣬����������Ĺ�����ʽҲ��MASM��ȫ��ͬ�����Ե����ĵ�4����5�¡� ������ NASM���� ---------------- 3.1 NASMԴ�����е���ɡ� ����ܶ������Ļ������ÿһ��NASMԴ�������(��������һ���꣬һ��Ԥ�������� ������һ����������������ο���4��5��)�����ĸ����ֵ�ȫ����ij�������֣� label: instruction operands ; comment ͨ������Щ��Ĵ󲿷��ǿ�ѡ�ģ�label,instruction,comment���ڻ򲻴��ڶ����� ���ġ���Ȼ��operands�����Ϊinstruction���Ҫ�����������벻���ڡ� NASMʹ�÷�б��(\)��Ϊ���з������һ����һ����б�߽������ǵڶ��лᱻ��Ϊ ��ǰ��һ�е�һ���֡� NASM����һ���еĿո����û���ϸ�����ƣ�labels���������ǵ�ǰ���пո񣬻� �����κζ�����label�����ð��ͬ��Ҳ�ǿ�ѡ�ġ�(ע�⵽������ζ��������� Ҫдһ��'lodsb'����ȴ�����д����'lodab'�����Խ�����Ч��һ�У�����һ�в��� �κ����飬ֻ�Ƕ�����һ��label������NASMʱ����������ѡ��'-w+orphan-labels' ����NASM���㶨����һ������ð�Ž�β��labelʱ�����㡣 labels�е���Ч���ַ�����ĸ�����֣�'-','$','#','@','~','.'��'?'����ֻ����ĸ '.',(�������⺬�壬����3.9),'_'��'?'������Ϊ��ʶ���Ŀ�ͷ��һ����ʶ������ �Լ���һ��'$'ǰ׺���Ա���������Ϊһ����ʶ�������DZ������������������Ļ��� ������뵽���ӽ���������ģ���ж�����һ�����Ž�'eax'���������'$eax'�� NASM���������������ԺͼĴ����ķ������ֿ��� instruction����԰����κλ���ָ�Pentium��P6ָ�FPUָ�MMXָ����� ��û�й�����ָ��Ҳ�ᱻ֧�֡���Щָ����Լ���ǰ׺'LOCK','REP','REPE/REPZ' ��'REPNE'/'REPNZ'��ͨ����֧����ʾ�ĵ�ַ�ߴ�Ͳ������ߴ�ǰ׺'A16','A32', 'O16'��'O32'������ʹ�����ǵ�һ�������ڵھ��¸�������Ҳ����ʹ�öμĴ��� ����Ϊָ��ǰ׺�� ����'es mov [bx],ax'��Ч�ڴ���'mov [es:bx],ax'�������Ƽ� ��һ���﷨����Ϊ�����﷨�е������﷨����һ�¡����Ƕ�����'LODSB'������ ָ���û�в������������ǿ�����һ����ǰ׺�� ����'es lodsb'û���������﷨ ������ʽ ��ʹ��һ��ǰ׺ʱ��ָ��DZ���ģ���'CS','A32','LOCK'��'REPE'�����Ķ�ǰ׺ ���Ե���������һ���ϣ�NASM��������һ��ǰ׺�ֽڡ� ��Ϊ��ʵ�ʻ���ָ�����չ��NASMͬʱ�ṩ��һ��������α����ָ�����3.2�� ��ϸ������ ָ�����������ʹ��һ���ĸ�ʽ�����ǿ����ǼĴ����������ԼĴ���������ʾ(�� �磺'ax','bp','ebx','cr0'��NASM��ʹ��'gas'���﷨��������ַ���У��Ĵ����� ǰ�������һ��'%'����)���������ǿ�������Ч�ĵ�ַ(����3.3)������(3.4)���� ����ʽ�� ���ڸ���ָ�NASM���ܸ����﷨�������ʹ��MASM֧�ֵ�˫��������ʽ�������� ����ʹ��NASM���ڴ���������ȫ�õĵ���������ʽ��֧�ֵ�����ָ����﷨ ϸ�ڿ��Բ��ĸ�¼B�����磬�����д�� fadd st1 ; this sets st0 := st0 + st1 fadd st0,st1 ; so does this fadd st1,st0 ; this sets st1 := st1 + st0 fadd to st1 ; so does this �������еĸ���ָ���������ڴ�ʱ����ʹ������ǰ׺�е�һ��'DWORD',QWORD' ��'TWORD'��ָ���������õ��ڴ�ijߴ硣 3.2 αָ� αָ����һЩ������������x86����ָ������DZ�������instruction���е�ָ ���Ϊʹ�����ǿ��Դ����ܴ�ķ��㡣��ǰ��αָ����'DB','DW','DD','DQ'�� ��DT�������Ƕ�Ӧ��δ��ʼ��ָ����'RESB','RESW','RESD','RESQ'��'REST'��'INCBIN' ���'EQU'�����'TIEMS'ǰ׺�� 3.2.1 `DB'һ���αָ��: �����ѳ�ʼ�������ݡ� ��NASM�У�`DB', `DW', `DD', `DQ'��`DT'����������������ļ��������ѳ�ʼ�� �����ݣ�����Զ��ַ�ʽʹ�����ǣ� db 0x55 ; just the byte 0x55 db 0x55,0x56,0x57 ; three bytes in succession db 'a',0x55 ; character constants are OK db 'hello',13,10,'$' ; so are string constants dw 0x1234 ; 0x34 0x12 dw 'a' ; 0x41 0x00 (it's just a number) dw 'ab' ; 0x41 0x42 (character constant) dw 'abc' ; 0x41 0x42 0x43 0x00 (string) dd 0x12345678 ; 0x78 0x56 0x34 0x12 dd 1.234567e20 ; floating-point constant dq 1.234567e20 ; double-precision float dt 1.234567e20 ; extended-precision float 'DQ'��'DT'��������ֵ�������ַ���������Ϊ�������� 3.2.2 `RESB'���αָ��: ����δ��ʼ�������ݡ� `RESB', `RESW', `RESD', `RESQ' and `REST'���������ģ���BSS���У��������� δ��ʼ���Ĵ洢�ռ䡣ÿһ�����е��������������������ֽ�������������˫���� ����������Ҫ������λ��������2.2.7���������ģ�NASM��֧��MASM/TASM�Ŀ���δ ��ʼ���ռ���﷨'DW ?'�����ƵĶ�������������������������NASM�Լ��ķ�ʽ�� 'RESB'��αָ��IJ����������ϸ���﷨�ģ�����3.8�� ���磺 buffer: resb 64 ; reserve 64 bytes wordvar: resw 1 ; reserve a word realarray resq 10 ; array of ten reals 3.2.3 `INCBIN':���������������ļ��� 'INCBIN'�Ǵ��ϵ�Amiga�����DevPac�н�����ģ�����һ���������ļ��������� ����������ļ��С����ܷܺ������һ����Ϸ��ִ���ļ��а�����ͼ��������� �ݡ�����������������ʽ���κ�һ��ʹ�ã� incbin "file.dat" ; include the whole file incbin "file.dat",1024 ; skip the first 1024 bytes incbin "file.dat",1024,512 ; skip the first 1024, and ; actually include at most 512 3.2.4 `EQU': ���峣���� 'EQU'����һ�����ţ�����һ������ֵ����ʹ��'EQU'ʱ��Դ�ļ����ϱ������һ��label�� 'EQU'����Ϊ���ǰѸ�����label�����ֶ�������IJ�����(Ψһ)��ֵ�������Dz��ɸ� �ĵģ����磺 message db 'hello, world' msglen equ $-message ��'msglen'������˳���12��'msglen'�����ٱ��ض��塣��Ҳ����һ��Ԥ�������壺 'msglen'��ֵֻ������һ�Σ�������ʹ�õ���'$'(����3.5)�ڴ�ʱ�ĺ��塣ע�� ��EQU���IJ�����Ҳ��һ���ϸ��﷨�ı���ʽ��(����3.8) 3.2.5 `TIMES': �ظ�ָ������ݡ� ǰ׺'TIMES'����ָ�����Ρ�����ij�ֳ�������NASM����MASM���ݻ������ 'DUP'�﷨�ĵȼ�����������д�� zerobuf: times 64 db 0 �����ƵĶ�������'TEIMES'������Զ��ֹ�ڴˡ�'TIMES'�IJ�����������һ����ֵ�� ����������ֵ����ʽ������������������� buffer: db 'hello, world' times 64-$+buffer db ' ' �����԰�'buffer'�ij��Ⱦ�ȷ�ض���Ϊ64�ֽڣ���TIMES�����Ա�����һ���ָ���ϣ� �����������Ҫ��д��չ����ѭ���� times 100 movsb ע����'times 100 resb 1'��'resb 100'֮�䲢û�����������𣬳��˺����ڻ�� ʱ�����һ�ٱ��� ����'EQU','RESB'����һ���� 'TIMES'�IJ�����Ҳ���ϸ��﷨�ı���ʽ��(��3.8) ע��'TIMES'�����Ա����ں��ϣ�ԭ����'TIMES'�ں걻�������ٱ������������� ��TIMES'�IJ��������������'64-$+buffer'�����ı���ʽ��Ҫ�ظ�����һ�еĴ� �룬����һ���꣬ʹ��Ԥ����ָ��'%rep'�� 3.3 ��Ч��ַ һ����Ч��ַ��һ��ָ��IJ�����,���Ƕ��ڴ��һ�����á���NASM�У���Ч��ַ ���﷨�Ƿdz��򵥵ģ�����һ���ɼ���ı���ʽ��ɣ�����һ���������ڡ����磺 wordvar dw 123 mov ax,[wordvar] mov ax,[wordvar+1] mov ax,[es:wordvar+bx] �κ���������һ�µı��ﶼ����NASM����Ч���ڴ����ã����磺'es:wordvar[bx]'�� ������һЩ����Ч��ַ�����纬�ж���Ĵ����ģ�Ҳ����ͬ���ķ�ʽ������ mov eax,[ebx*2+ecx+offset] mov ax,[bp+di+8] NASM����Щ��Ч��ַ�Ͼ��н��д�����������������Կ��Ʋ��Ϸ���һЩ��Ч��ַ ʹ���϶���û������ģ� mov eax,[ebx*5] ; assembles as [ebx*4+ebx] mov eax,[label1*2-label2] ; ie [label1+(label1-label2)] ��Щ��ʽ����Ч��ַ�ڻ�����ж�����ʽ���ڴ��������£�NASM���Զ����� ��С������ʽ�����磬32λ����Ч��ַ'[eax*2+0]'��'[eax+eax]'�ڻ������ ��ȫ��ͬ����ʽ��NASMͨ��ֻ�����ɺ��ߣ���Ϊǰ�߻�Ϊ0ƫ�ƶ࿪��4���ֽڡ� NASM����һ�������Ļ��ƣ������'[eax+ebx]'��'[ebx+eax]'������ͬ�IJ����룻 ͨ�������Ǻ����õģ���Ϊ'[esi+ebp]'��'[ebp+esi]'���в�ͬ��ȱʡ�μĴ����� ������ˣ���Ҳ����ʹ�ùؼ���'BYTE','WORD','DWORD'��'NOSPLIT'ǿ��NASM�� ���ض���ʽ����Ч��ַ�����������'[eax+3]'�����ɾ���һ��double-word�� ƫ���򣬶�������NASMȱʡ����һ���ֽڵ�ƫ�ơ������ʹ��'[dword eax+3]'�� ͬ���������ǿ��NASMΪһ����һ����ʱû�п�����Сֵ����һ��һ�ֽڵ�ƫ ��(�����������ӣ����Բ���3.8)�����磺'[byte eax+offset]'����һ�������� ������[byte eax]'�ᱻ����'[eax+0]'������һ���ֽڵ�0ƫ�ơ���'[dword eax]'���һ��double-word��0ƫ�ơ������õ���ʽ��'[eax]'�򲻻����ƫ���� ����ϣ����16λ�Ĵ����д�ȡ32λ���е�����ʱ����������������ʽ�Ƿdz����� �ġ������ⷽ��ĸ�����Ϣ�������9.2��ʵ���ϣ������Ҫ��ȡһ������֪ƫ �Ƶ�ַ�������ݣ��������ַ�ִ���16λֵ������㲻ָ��һ��dwordƫ�ƣ� NASM���ø�λ�ϵ�ƫ��ֵ��ʧ�� ���Ƶģ�NASM���'[eax*2]'���ѳ�'[eax+eax]' ,��Ϊ����������ƫ���򲻴��� �Դ˽�ʡ�ռ䣻ʵ���ϣ���Ҳ��'[eax*2+offset]'�ֳ�'[eax+eax+offset]'���� ����ʹ�á�NOSPLIT'�ؼ��ָı�������Ϊ��`[nosplit eax*2]'��ǿ�� `[eax*2+0]'��������˼�������� 3.4 ���� NASM���������ֲ�ͬ���͵ij�������ֵ���ַ����ַ����͸������� 3.4.1 ��ֵ������ һ����ֵ������ֻ��һ����ֵ���ѡ�NASM�������Զ��ַ�ʽָ����ֵʹ�õ� ���ƣ�������Ժ�׺'H','Q','B'��ָ��ʮ�����������˽������Ͷ��������� �����������C����ǰ׺'0x'��ʾʮ����������������Borland Pascal�� ���ǰ׺'$'����ʾʮ����������ע�⣬'$'ǰ׺�ڱ�ʶ���о���˫��ְ�� (����3.1)������һ����'$'��ǰ׺��ʮ��������ֵ������'$'��������֣��� �����ַ��� �뿴һЩ���ӣ� mov ax,100 ; decimal mov ax,0a2h ; hex mov ax,$0a2 ; hex again: the 0 is required mov ax,0xa2 ; hex yet again mov ax,777q ; octal mov ax,10010011b ; binary 3.4.2 �ַ��ͳ����� һ���ַ���������ɰ�����˫���Ż������е��ĸ��ַ���ɡ����ŵ����� ��ʹ�ø�NASM�����ط�ûʲô���𣬵���һ�㣬��������������˫���ų��֡� һ�����ж���ַ����ַ������ᱻlittle-endian order��������д�� mov eax,'abcd' �����ij���������`0x61626364'������`0x64636261'��������ѳ��������ڴ� �Ļ����������'abcd'������'dcba'����Ҳ�DZ��ڵ�'CPUID'ָ��������ַ��� ����ʽ(����B.4.34) 3.4.3 �ַ��������� �ַ�������һ��ֻ��һЩα����ָ����ܣ�����'DB'�࣬����'INCBIN'�� һ���ַ����������ַ���������ȥ�����񣬵��᳤һЩ��������������� �ȵ��ַ�����֮������ӡ����ԣ�������������ǵȼ۵ģ� db 'hello' ; string constant db 'h','e','l','l','o' ; equivalent character constants ���У������Ҳ�ǵȼ۵�: dd 'ninechars' ; doubleword string constant dd 'nine','char','s' ; becomes three doublewords db 'ninechars',0,0,0 ; and really looks like this ע�⣬�����Ϊ'db'�IJ�����������'ab'�ij����ᱻ�������ַ����������� Ϊ����Ϊ�ַ������Ļ����������̣���Ϊ���������������'db 'ab'��� 'db 'a''����ͬ����Ч�������Ǻ��޴��ġ�ͬ���ģ����ַ������ַ������� ����Ϊ'dw'�IJ�����ʱ���������ַ����� 3.4.4 ���㳣�� ���㳣��ֻ����Ϊ'DD','DQ','DT'�IJ�����ʱ�����ܡ������Դ�ͳ����ʽ�� ���ֵ��Ȼ��һ����㣬Ȼ���ǿ�ѡ�ĸ������ֵ��Ȼ����ѡ��'E'���� һ��ָ���������ǿ�Ʊ����еģ�������NASM�Ϳ��԰����Ǹ�'dd 1'���ֿ��� ��ֻ������һ�����ͳ�������'dd 1.0'����һ�������ͳ����� һЩ����: dd 1.2 ; an easy one dq 1.e10 ; 10,000,000,000 dq 1.e+10 ; synonymous with 1.e10 dq 1.e-10 ; 0.000 000 000 1 dt 3.141592653589793238462 ; pi NASM�����ڱ���ʱ�󸡵㳣����ֵ��������ΪNASM�����Ϊ����ֲ�ģ������� ������x86�������ϵĴ��룬���������ȴ���Ժ�ANSI C������һ���������� ��ϵͳ�ϡ����ԣ���������ܱ�֤ϵͳ���ܴ���һ���ܴ���Intel�������ĸ� �㵥Ԫ�����ԣ�NASMΪ���ܹ������������㣬�����뺬�����Լ���һ������ �ĸ��㴦�����̣�����������˻�����Ĵ�С��ȴ����˲�����ĺô��� 3.5 ����ʽ NASM�еı���ʽ�﷨��C����Ƿdz����Ƶġ� NASM����ȷ������ʱ�ڼ������ʽʱ���������ߴ磺��ΪNASM������64λϵ ͳ�Ϸdz��õı�������У���Ҫ�������ʽ������32λ�ļĴ����б�����ģ� ����Ҫ���صضԴ��������������������������������Ĺ�����NASMΨһ�� ����֤���ǣ�������ӵ��32λ���ȡ� NASM�ڱ���ʽ��֧����������ļǺţ���'$'��'$$',�����������õ�ǰָ�� �ĵ�ַ��'$'����õ�����������Դ�����еĿ�ʼ���ĵ�ַ����������Լ� ����д�����Ĵ���'jmp $'����ʾ����ѭ����'$$'���㵱ǰ�ο�ʼ���ĵ�ַ�� ���������ͨ��($-$$)�ҳ��㵱ǰ�ڶ��ڵ�ƫ�ơ� NASM�ṩ����������������ȼ�Ϊ���о����£� 3.5.1 `|': λ��������� �����'|'����һ��λ���Ļ����㣬��ִ�еIJ��������ָ��'or'����ȫ�� ͬ�ġ�λ����NASM�����ȼ���͵�������� 3.5.2 `^': λ���������� `^' �ṩλ�������� 3.5.3 `&': λ��������� `&' �ṩλ�����㡣 3.5.4 `<<' and `>>': λ��������� `<<' �ṩλ����, ��C�е�ʵ��һ��������'5<<3'�൱�ڰ�5����8��'>>'�� ��λ���ơ���NASM�У�������λ�������޷��ŵģ�����λ�ƺ���������� ����䣬�������з�����չ�� 3.5.5 `+' and `-': ������������ '+'��'-'������ṩ��������ͨ�Ӽ������ܡ� 3.5.6 `*', `/', `//', `%'��`%%': �˳���������� '*'�dz˷��������'/'��'//'���dz����������'/'���޷��ų���'//'�Ǵ� ���ų���ͬ���ģ�'%'��'%%'�ṩ�޷���������ŵ�ģ���㡣 ͬANSI Cһ����NASM����֤�Դ�����ģ����ִ�еIJ�������Ч�ԡ� ��Ϊ'%'����Ҳ����Ԥ������ʹ�ã�����뱣֤�����Ǵ����Ż����޷��ŵ� ģ��������������пո� 3.5.7 һԪ�����: `+', `-', `~'��`SEG' ��Щֻ������һ��������һԪ�������NASM�ı���ʽ�﷨�����ȼ���ߵġ� '-'�����IJ�����ȡ����'+'�����κ�����(��ֻ��Ϊ�˺�'-'���ֶԳ�), '~'�����IJ�����ȡ���룬��'SEG'�ṩ���IJ������Ķε�ַ(��3.6�л��� ��ϸ����)�� 3.6 `SEG'��`WRT' ��д�ܴ��16λ����ʱ����������ֳɺܶ�Σ���ʱ�����ö���һ�����ŵ� ��ַ�������Ƿdz��б�Ҫ�ģ�NASM�ṩ��'SEG'��������ʵ��������ܡ� 'SEG'���������ط������ڵ���ѡ�εĶλ�ַ����һ���λ�ַ�������ŵ�ƫ �Ƶ�ַ����Ϊ�ο�ʱ������Ч�ģ����ԣ����룺 mov ax,seg symbol mov es,ax mov bx,symbol ������'ES:BX'������һ��ָ�����'symbol'����Чָ�롣 �������������ܱ��⻹Ҫ����Щ����Ϊ16λ�Ķ������ǿ����໥�ص��ģ� ��ͨ��������Ҫͨ����ͬ�Ķλ�ַ����������ѡ�Ķλ�ַ������һ���� �ţ�NASM����������������ͨ��ʹ��'WRT'�ؼ��֣����������д�� mov ax,weird_seg ; weird_seg is a segment base mov es,ax mov bx,symbol wrt weird_seg ����'ES:BX'������һ����ͬ�ģ���������ȴ����ͬ��ָ��'symbol'��ָ �롣 ͨ��ʹ��'call segment:offset'��NASM�ṩfall call(����)��jump,���� 'segment'��'offset'��������������ʽ���֡�����Ҫ����һ��Զ���̣��� �������±�д���룺 call (seg procedure):procedure call weird_seg:(procedure wrt weird_seg) (�����Բ����ֻ��Ϊ��˵�����㣬ʵ��ʹ���в�����Ҫ) NASM֧������'call far procedure'���﷨���������һ���ǵȼ۵ġ�'jmp' �Ĺ�����ʽ��'call'��������ȫ��ͬ�� �����ݶ���Ҫ����һ��ָ������Ԫ�ص�Զָ�룬��������������д�� dw symbol, seg symbol NASMû���ṩ��������д������������ú��Լ�����һ���� 3.7 `STRICT': Լ���Ż��� ���ڻ��ʱ���Ż����򿪵�2����߼���ʱ��(����2.1.15)��NASM��ʹ�� �ߴ�Լ��('BYTE','WORD','DWORD','QWORD',��'TWORD')��������Ǿ��� ��С�ijߴ硣�ؼ���'STRICT'������Լ�����Ż���ǿ��һ���ض��IJ��� ��Ϊһ���ض��ijߴ硣���磬���Ż����򿪣�����'BITS 16'ģʽ�£� push dword 33 �ᱻ����� `66 6A 21',�� push strict dword 33 �ᱻ����������ֽڣ�����һ��������˫��������`66 68 21 00 00 00'. �����Ż����ر�ʱ������'STRICT'��û��ʹ�ã����������ͬ�Ĵ��롣 3.8 �ٽ����ʽ�� NASM��һ������������һ������Ļ����������TASM������������������� ֻ�������ࡣ�������Ͳ��ܴ�����Щ�dz����ӵ���Ҫ��������������� ��Դ���롣 ��һ����������ȷ�����еĴ��������ݵijߴ��С�������Ļ����ڵڶ��� ���������ʱ�򣬾Ϳ���֪���������õ����з��ŵ�ַ�����ԣ���һ���� NASM���ܴ������Ǿ���һ�δ���ijߴ���������һ������ֵ������������� ����δ���ĺ��汻���������磺 times (label-$) db 0 label: db 'Where am I?' 'TIMES'�IJ��������ǿ��ԺϷ��ý��м���ģ���NASM�в���������������Ϊ ���ڵ�һ�ο���TIMESʱ��ʱ�򲢲�֪�����ijߴ��С������ܾ������Ĵ��롣 times (label-$+1) db 0 label: db 'NOW where am I?' ������Ĵ����У�TIMES�IJ����Ǵ���ġ� NASMʹ��һ�������ٽ����ʽ�ĸ���Խ�ֹ��������Щ���ӣ��ٽ����ʽ ������Ϊһ������ʽ��������Ҫ��ֵ�ڵ�һ����ʱ���ǿɼ���ģ����ԣ� �ñ���ʽ�������ķ��Ŷ���֮ǰ�Ѿ������˵ģ�'TIMES'ǰ׺�IJ�������һ�� �ٽ����ʽ��ͬ����ԭ��'RESB'���αָ��IJ���Ҳ���ٽ����ʽ�� �ٽ����ʽ���ܻ������������������� mov ax,symbol1 symbol1 equ symbol2 symbol2: �ڵ�һ���ʱ��NASM����ȷ��'symbol1'��ֵ����Ϊ'symbol1'������ɵ��� 'symbols2',����ʱ��NASM��û�п���symbol2�������ڵڶ����ʱ�򣬵����� ��'mov ax,symbol1',������Ϊ��������ȷ�Ĵ��룬��Ϊ����û��֪��'symbol1' ��ֵ����������һ�е�ʱ�����ֿ�����'EQU'����ʱ������ȷ��symbol1��ֵ �ˣ�����ʱ�Ѿ�̫���ˡ� NASMΪ�˱���������⣬��'EQU'�Ҳ�ı���ʽҲ����Ϊ�ٽ����ʽ�����ԣ� 'symbol1'�Ķ����ڵ�һ���ʱ��ͻᱻ�ܾ��� ���ﻹ��һ������ǰ�����õ����⣺��������Ĵ���Σ� mov eax,[ebx+offset] offset equ 10 NASM�ڵ�һ���ʱ�򣬱����ڲ�֪��'offset'ֵ������¼���ָ�� 'mov eax,[ebx+offset]'�ijߴ��С����û�а취֪��'offset'�㹻С������ ����һ���ֽڵ�ƫ�����У����ԣ����Բ���һ������ʽ����Ч��ַ����ķ� ʽ�����������⣻�ڵ�һ���У�����֪�������й���'offset'������ǣ��� �����Ǵ�����е�һ�����ţ����ң���������Ҫ���ֽڵ���ʽ�����ԣ���ǿ�� ����ָ��ij���Ϊ�ʺ����ֽڵ�ַ��ij��ȡ��ڵڶ����ʱ����������Ѿ� �����ˣ�������ʹ����ָ��ܳ������ԣ���������²����Ĵ���û���㹻��С�� ����������ͨ���ȶ���offset�İ취�õ����������ǿ����Ч��ַ�ijߴ�� С��������д���룺 [byte ebx+offset] 3.9 ����Labels NASM������Щ��һ����㿪ʼ�ķ��Ż������⴦��,һ���Ե�����㿪ʼ�� Label�ᱻ�����ɱ���label, ����ζ�������ǰ��һ���DZ���label�����. ����: label1 ; some code .loop ; some more code jne .loop ret label2 ; some code .loop ; some more code jne .loop ret ����Ĵ���Ƭ����,ÿһ��'JNE'ָ�����������Ͻ���ǰ���һ����,��Ϊ'.loop' ����������ͨ��������ǰ��ķDZ���Label������������뿪���ˡ� ���ڱ���Label�Ĵ�����ʽ�Ǵ��ϵ�Amiga�����DevPac�н�������ģ����� ��ˣ�NASM�ṩ�˽�һ�������ܣ���������һ�δ����е��ñ���labels���� ��ͨ���ڱ���label��ǰ����ϷDZ���labelǰ׺ʵ�ֵģ���һ��.loopʵ���ϱ� ����Ϊ'label1.loop'�����ڶ������ű�����'label2.loop'��������ȷʵ��Ҫ �Ļ����д�� label3 ; some more code ; and some more jmp label1.loop ��ʱ�����Ǻ����õ�(������ʹ�ú��ʱ��)�����Զ���һ��label,������ ���κεط������ã���������Գ���ı���label���Ʋ������š������� label�����ǷDZ���label,��Ϊ�DZ���label��Ա���labels���ظ������� ���ò������ţ�Ҳ�����DZ��صģ���Ϊ��������ĺ�Ͳ���֪��label��ȫ ���ˡ�����NASM�����˵�����label,��ֻ�ں궨�������ã����һ��label ��һ��ǰ׺'..@'��ʼ��������Ա���label�������ţ����ԣ������д�� label1: ; a non-local label .local: ; this is really label1.local ..@foo: ; this is a special symbol label2: ; another non-local label .local: ; this is really label2.local jmp ..@foo ; this will jump three lines up NASM���ܶ���������������ţ�������������㿪ʼ�ķ��ţ����� '..start'������ָ��'.obj'����ļ���ִ����ڡ�(����6.2.6) ������ NASMԤ�������� -------------------------------- NASMӵ��һ��ǿ��ĺ괦��������֧��������࣬�༶�ļ�������������ʽ�� ��(���е�����е�)������Ϊ��ǿ��ĺ����������õġ�context stack'���� Ԥ����ָ�����һ��'%'��ͷ�� Ԥ�������������Է�б��(\)��β�������кϲ�Ϊһ�У����磺 %define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \ THIS_value �� �����ǵ���һ���������������� 4.1 ���еĺꡣ 4.1.1 ��õķ�ʽ: `%define' ���еĺ�����Ԥ����ָ��'%define'����ġ����幤��ͬC�����ƣ�������� ���������� %define ctrl 0x1F & %define param(a,b) ((a)+(a)*(b)) mov byte [param(2,ebx)], ctrl 'D' �ᱻ��չΪ�� mov byte [(2)+(2)*(ebx)], 0x1F & 'D' �����еĺ걻��չ���󻹺��������ĺ�ʱ��չ����������ִ��ʱ���У������� ����ʱ��������Ĵ��룺 %define a(x) 1+b(x) %define b(x) 2*x mov ax,a(8) ����Ԥ�ڵ�������չ����'mov ax, 1+2*8'�� ���ܺ�'b'�������ڶ����a ��ʱ����ġ� ��'%define'����ĺ��Ǵ�Сд���еģ��ڴ���'%define foo bar'֮��ֻ�� 'foo'�ᱻ��չ��'bar'��'Foo'����'FOO'�����ᡣ��'%idefine'������'%define' (i����'insensitive')�������һ�ζ������еĴ�Сд��ͬ�ĺꡣ���� '%idefine foo bar'�ᵼ��'foo','FOO','Foo'�ȶ��ᱻ��չ��'bar'�� ��һ��Ƕ�׶���(һ���궨���к���������)�ĺ걻չ��ʱ����һ�����ƿ��� ��⵽������֤�������һ������ѭ���������Ƕ�׶���ĺ꣬Ԥ������ֻ ��չ����һ�㣬��ˣ����������д�� %define a(x) 1+a(x) mov ax,a(3) �� `a(3)'�ᱻ��չ��'1+a(3)'�������ٱ���һ����չ��������Ϊ�Ǻ����õģ��� �����������������8.1�� �������������ص��к꣺���������д�� %define foo(x) 1+x %define foo(x,y) 1+x*y Ԥ�������ܹ����������ֺ���ã�����ͨ���㴫�ݵIJ����ĸ������������ֵģ� ����'foo(3)'����'1+3'����'foo(ebx,2)'����'1+ebx*2'��������ˣ������ �㶨���ˣ� %define foo bar ��ô�����Ķ�'foo'�Ķ��嶼���ᱻ�����ˣ�һ�����������ĺ궨�岻���� �������д��в��������ض��塣 ���Ⲣ������ֹ���к걻�ض��壺��������������壬���ҹ����úܺã� %define foo bar Ȼ����Դ�����ļ����Ժ�λ���ض������� %define foo baz Ȼ�������ú�'foo'�����еط��������ᱻ��չ�����¶����ֵ�������� '%assign'�����ʱ�dz�����(����4.1.5) ���������������ʹ��'-d'ѡ����Ԥ����ꡣ����2.1.11 4.1.2 %define����ǿ��: `%xdefine' ���ڵ��ú�ʱչ���겻ͬ�������Ҫ����һ��Ƕ����������ĺ�ʱ��ʹ�� ���ڱ������ֵ������Ҫ'%define'�����ṩ������һ�ֻ��ơ�����ķ��� ��ʹ��'%xdefine'���������Ĵ�Сд�����е���ʽ'%xidefine'�� �����������еĴ��룺 %define isTrue 1 %define isFalse isTrue %define isTrue 0 val1: db isFalse %define isTrue 1 val2: db isFalse ����������£�'val1'����0,��'val2'����1��������Ϊ����һ�����к��� '%define'����ʱ����ֻ�ڱ�����ʱ����չ������'isFalse'�DZ�չ���� 'isTrue'������չ�����ǵ�ǰ��'isTrue'��ֵ����һ�κ걻����ʱ��'isTrue' ��0,���ڶ�����1�� �����ϣ��'isFalse'��չ������'isFalse'������ʱǶ���'isTrue'��ֵ�� ������д����Ĵ��룬ʹ��'%xdefine': %xdefine isTrue 1 %xdefine isFalse isTrue %xdefine isTrue 0 val1: db isFalse %xdefine isTrue 1 val2: db isFalse ����ÿ��'isFalse'�����ã������ᱻչ����1����������Ƕ��ĺ�'isTrue' ��'isFalse'������ʱ��ֵ�� 4.1.3 : ���ӵ��к�ķ��ţ� `%+' һ�����к��еĵ����ļǺſ��Ա��������������һ�������ļǺ��� ���Ժ��������ںܶദ�����Ƶ���������Ƶĺ��зdz����á� �ٸ����ӣ���������Ĵ���: %define BDASTART 400h ; Start of BIOS data area struc tBIOSDA ; its structure .COM1addr RESW 1 .COM2addr RESW 1 ; ..and so on endstruc ���ڣ�������Ҫ��ȡtBIOSDA�е�Ԫ�أ����ǿ��������� mov ax,BDASTART + tBIOSDA.COM1addr mov bx,BDASTART + tBIOSDA.COM2addr ����ںܶ�ط���Ҫ�õ�������÷dz��ķ�����Ȥ����ʹ������ �ĺ�����С���ֵ����� ; Macro to access BIOS variables by their names (from tBDA): %define BDA(x) BDASTART + tBIOSDA. %+ x ���ڣ����ǿ�������������д���룺 mov ax,BDA(COM1addr) mov bx,BDA(COM2addr) ʹ��������ԣ����ǿ��Լ򵥵����ô����ĺꡣ(���⣬�����Լ��ٴ� �ִ���)�� 4.1.4 ȡ���궨��: `%undef' ���еĺ����ʹ��'%undef'������ȡ�������磬����Ĵ��룺 %define foo bar %undef foo mov eax, foo �ᱻչ����ָ��'mov eax, foo'����Ϊ��'%undef'֮�󣬺�'foo'�����޶��� ״̬�� ��Щ��Ԥ����ĺ����ͨ������������ʹ��'-u'ѡ����ȡ�����壬���� 2.1.12�� 4.1.5 Ԥ���������� : `%assign' ���嵥�к����һ����ʽ��ʹ������'%assign'(���Ĵ�Сд��������ʽ ��%iassign������֮���������'%idefine','%idefine'֮���������ȫ�� ͬ)�� '%assign'���������嵥�к꣬�������в���������һ����ֵ�͵�ֵ������ ֵ�����Ա���ʽ����ʽָ������Ҫ��'%assing'ָ�����ʱ���Ա�һ�� ��������� ����'%define','%assign'����ĺ�����ں������ض��壬����������� ������ %assign i i+1 �Դ������Ӻ����ֵ '%assing'�ڿ���'%rep'��Ԥ������ѭ���Ľ�������ʱ�dz����ã���� ��4.5�����ӡ�����Ĺ���'%assign'��ʹ����7.4��8.1�е��ᵽ�� ����'%assign'�ı���ʽҲ���ٽ����ʽ(����3.8)�����ұ���ɱ����� ��һ������ֵ��(������һ�����ض�λ��ָ���������ݵĵ�ַ�����ǰ� ���ڼĴ����е�һ��ֵ��) 4.2 �ַ���������: `%strlen' and `%substr' �ں�����Դ����ַ���ͨ���Ƿdz����õġ�NASM֧�������򵥵��ַ� �������꣬ͨ�����ǣ����Դ�����Ϊ���ӵIJ������� 4.2.1 ���ַ�������: `%strlen' '%strlen'�����'%assign'����Ϊ�괴��һ����ֵ�͵�ֵ����ͬ������ '%strlen'��������ֵ��һ���ַ����ij��ȡ�������һ��ʹ�õ����ӣ� %strlen charcnt 'my string' ����������У�'charcnt'�����һ��ֵ8,�͸�ʹ����'%assign'һ���� Ч��������������У�'my string'��һ�������ϵ��ַ���������Ҳ���� ��һ�����Ա���չ���ַ����ĵ��к꣬������������ӣ� %define sometext 'my string' %strlen charcnt sometext �����һ�������������Ҳ���'charcnt'��ֵ8 4.2.2 ȡ���ַ���: `%substr' �ַ����еĵ����ַ�����ͨ��ʹ��'%substr'��ȡ������������ʹ�õ� һ�����ӿ��ܱ������������Ϊ���ã� %substr mychar 'xyz' 1 ; equivalent to %define mychar 'x' %substr mychar 'xyz' 2 ; equivalent to %define mychar 'y' %substr mychar 'xyz' 3 ; equivalent to %define mychar 'z' ����������У�mychar�õ���ֵ'z'��������'%strlen'(����4.2.1)�������� ��һ��������һ����Ҫ�������ĵ��к꣬�ڶ������ַ��������������� ָ����һ���ַ�����ѡ����ע�⣬��һ������ֵ��1������0�������һ ������ֵ��ͬ��'%strlen'������ֵ���������ֵ�����˷�Χ����õ� һ�����ַ����� 4.3 ���к�: `%macro' ���к꿴��ȥ����MASM��TASM�еĺ꣺һ��NASM�ж���Ķ��к꿴��ȥ�� ������������ %macro prologue 1 push ebp mov ebp,esp sub esp,%1 %endmacro ���������һ������C�����ĺ�prologue�����������ͨ��һ��������ʹ �ú꣺ myfunc: prologue 12 �������д�����չ�����µ����ӣ� myfunc: push ebp mov ebp,esp sub esp,12 ��'%macro'һ���Ϻ������������'1'�����˺���Խ��յIJ����ĸ����� �궨�������'%1'���������ú�����еĵ�һ������������һ���ж� �������ĺ꣬�������п�������д��'%2','%3'�ȵȡ� ���к�����к�һ����Ҳ�Ǵ�Сд���еģ�������ʹ����һ�������� ��%imacro' ���������һ��������Ϊ������һ���ִ��ݸ����к꣬����԰��� ����������һ�������С����������������������д���룺 %macro silly 2 %2: db %1 %endmacro silly 'a', letter_a ; letter_a: db 'a' silly 'ab', string_ab ; string_ab: db 'ab' silly {13,10}, crlf ; crlf: db 13,10 4.3.1 ���к������ �����к꣬���к�Ҳ����ͨ�����岻ͬ�IJ���������ͬһ������ж�� ���ء�����Σ�û�жԲ��������ĺ�����⴦���ˡ���������Զ��壺 %macro prologue 0 push ebp mov ebp,esp %endmacro ��Ϊ����prologue����һ����ʽ����û�п��ٱ���ջ�ռ䡣 ��ʱ���������Ҫ����һ������ָ����磬������붨�壺 %macro push 2 push %1 push %2 %endmacro ��������Ϳ������±�д���룺 push ebx ; this line is not a macro call push eax,ecx ; but this one is ͨ����NASM�������ĵ�һ�и���һ��������Ϣ����Ϊ'push'���ڱ������ ��һ���꣬�����и����IJ�������ȴ�����Ϻ�Ķ��塣����ȷ�Ĵ��뻹�� �����ɵģ������Ǹ���һ��������ѡ����������Ϣ����ͨ�� '-w'macro-params��������ѡ������ֹ��(����2.1.17)�� 4.3.2 Macro-Local Labels NASM�������ڶ��к��ж���labels.ʹ���Ƕ���ÿһ������������DZ��ص�:�� �Զ�ε���ͬһ����ÿ�ζ���ʹ�ò�ͬ��label.�����ͨ����label����ǰ�� ����'%%'��ʵ�������÷�.����,����Դ���һ��ָ��,��������'Z'��־λ�� ����ʱִ��'RET'ָ��,����: %macro retz 0 jnz %%skip ret %%skip: %endmacro ����������εĵ��������,����ÿ�ε���ʱ��ʱ��,NASM����Ϊ'%%skip' ����һ����ͬ���������滻�����е�����.NASM���������ֿ������������ ��:'..@2345.skip',���������2345��ÿ�κ���õ�ʱ�򶼻ᱻ�޸�.�� '..@'ǰ׺��ֹmacro-local labels���ű���labels����,������3.9���� ����������.��Ӧ�ñ����ڶ������Լ��ĺ�ʱʹ��������ʽ('..@'ǰ׺,Ȼ�� ��һ������,Ȼ����һ�����),��Ϊ���ǻ��macro-local labels�໥���� ����. 4.3.3 ��ȷ���ĺ��������. ͨ��,����һ����,�������ڽ�����ǰ��ļ���������, �Ѻ�������в����� ��Ϊһ��������ʹ��,������Ƿdz����õ�,һ����ص�������,һ������� ����дһ���ַ�����һ��MS-DOS���ı��ļ���,����,�����ϣ������д����: writefile [filehandle],"hello, world",13,10 NASM������Ѻ�����һ�����������"̰������", Ҳ����˵����������ʱ ,ʹ���˱Ⱥ�Ԥ�ڵ�Ҫ��ö�IJ�������,�����ж�����IJ�����ͬ����֮�� �Ķ��Żᱻ��Ϊһ���������ݸ����ж�������һ��ʵ��,����,�����д: %macro writefile 2+ jmp %%endstr %%str: db %2 %%endstr: mov dx,%%str mov cx,%%endstr-%%str mov bx,%1 mov ah,0x40 int 0x21 %endmacro ������ʹ��'writefile'�����ӻ���Ԥ�ڵ���������:��һ��������ǰ���ı� [filehandle]�ᱻ��Ϊ��һ�������ʹ��,�ᱻ��'%1'������λ������չ,�� ����ʣ����ı������ϲ���'%2'��,����db����. ���ֺ��̰��������NASM����ͨ���ں��'%macro'һ���ϵIJ������������ ��'+'��ʵ�ֵ�. ����㶨����һ��̰����,��͵��ڸ���NASM������Щ��������ʵ����Ҫ�IJ� �������ĺ���ø������չ; �����������,����˵,NASM����֪���˵������� �����'writefile'����2,3��4�������IJ�����ʱ��,�������.�����غ� ʱ,NASM���������ĸ���,�������㶨����һ������4��������'writefile' ��. ��Ȼ,����ĺ�Ҳ������Ϊһ����̰����ִ��,�����������,�������Ӧ�� ����������д: writefile [filehandle], {"hello, world",13,10} NASM�ṩ���ֻ���ʵ�ְѶ��ŷŵ��������,�����ѡ������һ����ϲ���� ��ʽ. ��һ�����õİ취����д����ĺ�,�����5.2.1 4.3.4 ȱʡ�����. NASM�������㶨��һ�����к����һ�������IJ���������Χ.�������������, �����Ϊ����ָ��ȱʡֵ.����: %macro die 0-1 "Painful program death has occurred." writefile 2,%1 mov ax,0x4c01 int 0x21 %endmacro �����(��ʹ����4.3.3�ж���ĺ�'writefile')�ڱ����õ�ʱ�������һ�� ������Ϣ,�������˳�ǰ����ʾ�ڴ����������,������ڱ�����ʱ�������� ,����ʹ���ں궨���е�ȱʡ������Ϣ. ͨ��,����������ʽָ����������������ֵ����Сֵ; ��С�����IJ����� ����õ�ʱ���DZ����,Ȼ����ҪΪ�����Ŀ�ѡ����ָ��ȱʡֵ.����,��һ ���궨����������п�ʼʱ: %macro foobar 1-3 eax,[ebx+2] ���ڱ�����ʱ����ʹ��һ����������, ��'%1'�ں���õ�ʱ�����ָ��,'%2' ��û�б������ָ����ʱ��,�ᱻȱʡ�ظ�Ϊ'eax','%3'�ᱻȱʡ�ظ�Ϊ '[ebx+2]'. ������ں궨��ʱ©����ȱʡֵ�ĸ�ֵ, �����������,������ȱʡֵ����Ϊ ��.���ڿɴ��пɱ���������ĺ��зdz�����,��Ϊ�Ǻ�'%0'��������ȷ���� ���ٲ��������������˺�. ����ȱʡ�������ƿ��Ժ�'̰������'���ƽ������ʹ��;���������'die'�� ���Ա����ø�ǿ��,������,ֻҪ�ѵ�һ�ж����Ϊ������ʽ����: %macro die 0-1+ "Painful program death has occurred.",13,10 ��������������������,��'*'��ʾ.�����������,��Ȼ�Ͳ������ṩ���� ��ȱʡ����ֵ. ���������÷������Ӳμ�4.3.6. 4.3.5 `%0': ���������������. ����һ���ɴ��пɱ���������ĺ�, ��������'%0'�᷵��һ����ֵ������ʾ �ж��ٸ����������˺�.�������Ϊ'%rep'��һ������(����4.5),���������� ������в���. ������4.3.6�и���. 4.3.6 `%rotate': ѭ���ƶ������. Unix��shell����Ա����'shift' shell��������Ϥ������,�������Ѵ��ݸ�shell �ű��IJ�������(��'$1,'$2'������)����һ��,����, ǰһ�������ǡ�$1'�Ļ� ����֮�󣬾ͱ�ɡ�$2'�����ˣ�����'$1'֮ǰ��û�п��õIJ����ġ� NASM�������ƵĻ��ƣ�ʹ��'%rotate'���������ָ�������������ģ�����Unix ��'shift'�Dz�ͬ�ģ����������κ�һ��������ʧ����һ���������Ƶ�����ߵ� ʱ�����ƶ��������ͻ������ұߡ� '%rotate'�Ե�����ֵ��Ϊ�������е���(Ҳ������һ������ʽ)���������ѭ�� ���ƣ����ƵĴ������������������ָ���ġ����'%rotate'�IJ����Ǹ�������ô ������ͻᱻѭ�����ơ� ���ԣ�һ����������ͻָ��Ĵ���ֵ�ĺ��������д�� %macro multipush 1-* %rep %0 push %1 %rotate 1 %endrep %endmacro ����������Ϊ����ÿһ�����������ε���ָ��'PUSH'������ʼ�Ȱ����� ��һ������'%1'ѹջ��Ȼ�����'%rotate'�����в���ѭ������һ��λ�ã����� һ����ԭ���ĵڶ����������ھͿ�����'%1'��ȡ���ˡ��ظ�ִ��������̣� ֱ�����еIJ�������ִ����(����ͨ����'%0'��Ϊ'%rep'�IJ�����ʵ�ֵ�)�� ���ʵ���˰�ÿһ������������ѹջ�� ע�⣬'*'Ҳ������Ϊ������������һ����������������ʹ�ú�'multipush'�� ʱ�򣬲�������û�����ޡ� ʹ������꣬ȷʵ�Ƿdz�����ģ�ִ��ͬ�ȵ�'POP'���������Dz�����Ҫ�Ѳ��� ˳��һ�¡�һ�������Ľ�������ǣ�����дһ��'multipop'����ã�Ȼ��� ����ĵ����еIJ�������ճ�����������ˣ�����������еļĴ���ִ���෴ ˳���pop������ �����ͨ�����涨����ʵ�֣� %macro multipop 1-* %rep %0 %rotate -1 pop %1 %endrep %endmacro ����꿪ʼ�Ȱ����IJ���ѭ������һ��λ�ã�����һ����ԭ�������һ������ ���ڿ�����'%1'�����ˡ�Ȼ��pop,Ȼ�󣬲���������һ�����ƣ������ڶ��� ���������'%1'�������������Բ��������෴��˳��һһ��ִ�С� 4.3.7 ���������� NASM���԰Ѻ�������ӵ��������ı��С�������Կ�����������һ��ϵ�� �ķ��ţ����磬�ں궨���С���ϣ������һ�����ڹؼ�����ı��񣬶����� ���ڱ��е�ƫ��ֵ�йء������������д���룺 %macro keytab_entry 2 keypos%1 equ $-keytab db %2 %endmacro keytab: keytab_entry F1,128+1 keytab_entry F2,128+2 keytab_entry Return,13 �ᱻ��չ�ɣ� keytab: keyposF1 equ $-keytab db 128+1 keyposF2 equ $-keytab db 128+2 keyposReturn equ $-keytab db 13 ����Ժ����׵ذ��ı����ӵ�һ���������β��������д���ɣ�'%1foo'�� �����ϣ�������������һ�����֣����磬ͨ�����ݲ���'foo'������� ��'foo1'��'foo2',���㲻��д��'%11'����Ϊ��ᱻ��Ϊ�ǵ�11�������� �����д��'%{1}1'������ѵ�һ��1���ڶ����ֿ� ����������Ի�������������Ԥ���������У�����macro-local labels(4.3.2) ��context-local labels(4.7.2)�������е�����У��﷨�ϵĺ������嶼���� ͨ����'%'֮���ı�֮ǰ�IJ��ַ���һ�������еõ����������'%{%foo}bar ����ı�'bar'���ӵ�һ��macro-local label����%%foo'���������ֵĺ���(�� ���Dz���Ҫ�ģ���Ϊ��NASM����macro-local labels�Ļ���������'%{%foo}bar ��%%foobar���ᱻ��չ��ͬ������ʽ,��������ô�������������������ڵ�) 4.3.8 ����������Ϊ������� NASM���ں�����������ĺ�������������⴦�������������һ����ʽ '%+1'��ʹ�ú��������'%1'��������NASM������������һ���������룬 �������������ʱ��������û����Ч���������룬��ʹԤ������������ Ϊ����������Ը����ã��������'%-1'����ʽ��ʹ�ò�����������NASM�� �������������չ�����ķ��档����4.3.2�ж���ĺ�'retz'�������� ����ķ�ʽ��д�� %macro retc 1 j%-1 %%skip ret %%skip: %endmacro ���ָ�����ʹ��'retc ne'�����е��ã������������תָ����չ��'JE', ����'retc po'�������չ��'JPE'�� '%+1'�ĺ�������ÿ��ԺܺõİѲ���'CXZ'��'ECXZ'����Ϊ��Ч������ ���룻���ǣ�'%-1'���������IJ����ͻᱨ������Ϊ��������������û���� ����������ڡ� 4.3.9 ��ֹ�б���չ�� ��NASMΪ���Դ��������б��ļ���ʱ�������ں���õĵط�Ϊ��չ�� ���к꣬Ȼ���г�չ����������С���������㿴�����е���Щָ��չ ��������Щ���룻������ˣ���Щ����Ҫ�ĺ�չ������б�Ū�úܻ��ҡ� NASMΪ���ṩ��һ���޶���'.nolist',�����Ա�������һ���궨���У��� ���������Ͳ������б��ļ��б�չ�����޶���'.nolist'ֱ�ӷŵ����� �ĺ��棬�������������� %macro foo 1.nolist ���������� %macro bar 1-5+.nolist a,b,c,d,e,f,g,h 4.4 ������� ��CԤ���������ƣ�NASM������һ��Դ����ֻ��ij�ض���������ʱ���л�࣬ ����������Ե��﷨���������������ģ� %if ;if ����ʱ�������Ĵ��뱻��ࡣ %elif ; ��if�����㣬������ʱ���öδ��뱻��ࡣ %else ;������������ʱ���öδ��뱻��ࡣ %endif '%else'��'%elif'�Ӿ䶼�ǿ�ѡ�ģ���Ҳ����ʹ�ö���һ����'%elif'�Ӿ䡣 4.4.1 `%ifdef': ���Ե��к��Ƿ���ڡ� '%ifdef MACRO'����������ʼһ���������飬����������Ĵ��뵱�ҽ� ��һ������'MACRO'���к걻����ʱ�Żᱻ���ࡣ���û�ж��壬��ô '%elif'��'%else'��ᱻ������ ���磬������һ������ʱ�������ϣ������д���룺 ; perform some function %ifdef DEBUG writefile 2,"Function performed successfully",13,10 %endif ; go and do something else �����ͨ��ʹ��������ѡ��'-dDEBUG'������һ������������Ϣ�ij��򣬻� ��ʹ�ø�ѡ�����������շ����ij��� ��Ҳ���Բ���һ�����Ƿ�û�б����壬�����ʹ��'%ifndef'����Ҳ������ '%elif'���в��Ժ궨�壬ʹ��'%elifdef'��'%elifndef'���ɡ� 4.4.2 `ifmacro': ���Զ��к��Ƿ���ڡ� �����Dz��Զ��к�Ĵ��ڵģ�'%idmacro'�������Ĺ�����ʽ��'%ifdef'��һ ���ġ� ���磬������ڱ�дһ���ܴ�Ĺ��̣������޷����ƴ������ӿ��еĺꡣ�� ������Ҫ����һ���꣬��������ȷ�������û�б���������������������ˣ� ����ҪΪ��ĺ껻һ�����֡� ����㶨���һ�����ض���������������ĺ������еĺ�������ͻ����ô '%ifmacro'�᷵���档���磺 %ifmacro MyMacro 1-3 %error "MyMacro 1-3" causes a conflict with an existing macro. %else %macro MyMacro 1-3 ; insert code to define the macro %endmacro %endif ���û�����еĺ�������ͻ����Ὠ��һ����'MyMacro 1-3"�ĺ꣬��� ���г�ͻ����ô�Ͳ���һ��������Ϣ�� �����ͨ��ʹ��'%ifnmacro'�������Ƿ�겻���ڡ�������ʹ��'%elifmacro' ��'%elifnmacro'��'%elif'���в��Զ��кꡣ 4.4.3 `%ifctx': ����������ջ�� ���ҽ���Ԥ��������������ջ�еĶ����������ĵ�������'ctxname'ʱ���� �����ָ��'%ifctx ctxname'���ý���������䱻��ࡣ��'%ifdef'һ���� ��Ҳ��'%ifnctx','%elifctx','%elifnctx'����ʽ�� ����������ջ�ĸ���ϸ�ڣ�����4.7, ����'%ifctx'��һ�����ӣ�����4.7.5. 4.4.4 `%if': ����������ֵ����ʽ�� ���ҽ�����ֵ����ʽ'expr'��ֵΪ����ʱ���������ָ��'%if expr'���ý� ��������䱻��ࡣʹ��������Կ���ȷ����ʱ�ж�һ��'%rep'Ԥ������ѭ �������Ӳ���4.5�� '%if'��'%elif'�ı���ʽ��һ���ٽ����ʽ(����3.8) '%if' ��չ�˳����NASM����ʽ�﷨���ṩ��һ���ڳ������ʽ�в����õ� ��ز�������������'=','<','>','<=','>='��'<>'�ֱ������ȣ�С��,�� �ڣ�С�ڵ��ڣ����ڵ��ڣ������ڡ���C���Ƶ���ʽ'=='��'!='��Ϊ'=','<>' ����һ����ʽҲ��֧�֡����⣬�����ȼ����߼�������'&&','^^',��'||'�� Ϊ�߼��룬�߼�����߼���Ҳ��֧�֡���Щ��C���߼����������ƣ���Cû ���ṩ�߼���򣩣���Щ�߼����������Ƿ���0��1�����Ұ��κη������뿴 ��1�����ԣ����磬 '^^'����������һ���������㣬��һ�������ʱ���� ����1������Щ����������1��Ϊ��ֵ��0��Ϊ��ֵ�� 4.4.5 `%ifidn' and `%ifidni': �����ı���ͬ�� ���ҽ���'text1'��'text2'����Ϊ���к�չ��������ȫ��ͬ��һ���ı�ʱ�� �ṹ'%ifidn text1,text2'���ý�������һ�δ��뱻��ࡣ�����ı��ڿո� �����ϵIJ�ͬ�ᱻ���ԡ� '%ifidni'��'%ifidn'���ƣ����Ǵ�Сд�����С� ���磬����ĺ��һ���Ĵ���������ѹջ�����������IP��Ϊһ����ʵ�ļ� ����ʹ�ã� %macro pushparam 1 %ifidni %1,ip call %%label %%label: %else push %1 %endif %endmacro ����������'%if'�ṹ��'%ifidn'Ҳ��һ��'%elifidn',�������ķ������ ʽ'%ifnidn','%elifnidn'.���Ƶģ�'%ifidni'Ҳ��'%elifidni',`%ifnidni' ��`%elifnidni'�� 4.4.6 `%ifid', `%ifnum', `%ifstr': ���ԼǺŵ����͡� ��Щ�����ݴ������ǵ���һ�����֣��ַ������ʶ����ִ�в�ͬ�Ķ����� ���磬һ������ַ����ĺ���ܻ�ϣ���ܹ��������������ַ���������һ ��ָ���Ѵ����ַ�����ָ�롣 ���ҽ����ڲ����б��ĵ�һ���ǺŴ�������һ����ʶ��ʱ���������ָ�� '%ifid'���ý�������һ�δ��뱻��ࡣ'%ifnum'���ơ������ԼǺ��Ƿ��� ���֣�'%ifstr'�����Ƿ����ַ����� ���磬4.3.3�ж���ĺ�'writefile'������'%ifstr'����һ���Ľ������£� %macro writefile 2-3+ %ifstr %2 jmp %%endstr %if %0 = 3 %%str: db %2,%3 %else %%str: db %2 %endif %%endstr: mov dx,%%str mov cx,%%endstr-%%str %else mov dx,%2 mov cx,%3 %endif mov bx,%1 mov ah,0x40 int 0x21 %endmacro �������Դ������������ַ�ʽ���еĵ��ã� writefile [file], strpointer, length writefile [file], "hello", 13, 10 �ڵ�һ�ַ�ʽ�£�'strpointer'����Ϊһ�����������ַ����ĵ�ַ���� 'length'��Ϊ���ij��ȣ��ڶ��ַ�ʽ�У�һ���ַ����������˺꣬���� ����Լ�����������Ϊ�������ַ�ͳ��ȡ� ע�⣬'%ifstr'�е�'%if'��ʹ�÷�ʽ�������ȼ����Ƿ񱻴����������� �����������������ô�ַ�������һ���������ַ�������������'db %2'�� �㹻�ˣ����߸��ࣨ��������£�����ǰ���������������ȫ��������Ҫ�� �ϲ���'%3'�У������Ҫ'db %2,%3'�ˡ�) ������'%elifXXX','%ifnXXX'��'%elifnXXX'/�汾��'%ifid','%ifnum',�� '%ifstr'�ж��Ǵ��ڵġ� 4.4.7 `%error': �����û��Զ������ Ԥ����������'%error'����NASM����һ���ڻ��ʱ�����Ĵ������ԣ���� ����û���Ҫ������Դ���룬����뱣֤����������Ĵ��붨������ȷ�� �꣺ %ifdef SOME_MACRO ; do some setup %elifdef SOME_OTHER_MACRO ; do some different setup %else %error Neither SOME_MACRO nor SOME_OTHER_MACRO was defined. %endif Ȼ���κβ�������Ĵ�����û����ᱻ���ʱ�õ��������ǵĴ���ľ��� ��Ϣ�����صȵ�����������ʱ�ٳ��ִ���ȴ��֪�������Ķ��� 4.5 Ԥ������ѭ��: `%rep' ��ȻNASM��'TIMES'ǰ׺�dz����ã����Dz�������������һ�����к꣬��Ϊ ������NASM�Ѿ�չ���˺�֮��ű������ġ����ԣ�NASM�ṩ������һ����ʽ ��ѭ�����������Ԥ����������ģ�'%rep'�� ������'%rep'��'%endrep'('%rep'����һ����ֵ������������һ������ʽ�� '%endrep'�����κβ���)����������Χһ�δ��룬Ȼ����δ�����Ա����� ��Σ�������Ԥ������ָ���� %assign i 0 %rep 64 inc word [table+2*i] %assign i i+1 %endrep ��δ�������������64��'INC'ָ����ڴ��ַ'[table]'һֱ������ '[table+126]'�� ����һ�����ӵ���ֹ������������Ҫ��ѭ����break�����������ʹ�� '%exitrep'����������ֹѭ������������������ fibonacci: %assign i 0 %assign j 1 %rep 100 %if j > 65535 %exitrep %endif dw j %assign k j+i %assign i j %assign j k %endrep fib_number equ ($-fibonacci)/2 ����Ĵ����������16λ��Fibonacci������Ҫע�⣬ѭ��������������Ҫ ��Ϊһ����������'%rep'������Է�ֹNASMԤ����������һ������ѭ������ ���������û�ϵͳ�У�����ѭ���ᵼ���ڴ汻�Ĺ��������������� 4.6 ���������ļ��� ��һ��ʹ�õ�һ����CԤ�������﷨�������ƵIJ���������������������Ĵ� ���а�������Դ�ļ��������ͨ��'%include'��ʵ�֣� %include "macros.mac" �����ļ�'macros.mac'�ļ��е����ݰ��������ڵ�Դ�ļ��С� �������ļ��ᱻ�ڵ�ǰĿ¼��Ѱ��(������������NASMʱ���ڵ�Ŀ¼�������� NASM��ִ���ļ����ڵ�Ŀ¼��Դ�����ļ����ڵ�Ŀ¼),�������NASM�������� ��ʹ��ѡ��'-i'����������·���� C�����з�ֹ�ļ����ظ�������ϰ��������NASM��Ҳ���ã�����ļ� 'macros.mac'����������ʽ�Ĵ��룺 %ifndef MACROS_MAC %define MACROS_MAC ; now define some macros %endif ������ΰ������ļ��Ͳ������������Ϊ�ڶ��ΰ������ļ�ʱ��ʲô Ҳ���ᷢ������Ϊ��'MACROS_MAC'�Ѿ���������ˡ� ��û��'%include'����������һ���ļ�ʱ�������ǿ��������ļ������� ��������������NASM��������ʹ��'-p'ѡ�� 4.7 ������ջ�� ��Щ��һ���궨�������DZ��ص�Labels��ʱ�򻹲���ǿ����ʱ������ Ҫ�ܹ��ڶ�������֮�乲��label������һ��'REPEAT'...'UNTIL'ѭ ����'REPEAT'���չ��������Ҫ�ܹ�ȥ����'UNTIL'�ж���ĺꡣ������ ʹ�������ĺ�ʱ������ܻ���Ƕ�׶��ѭ���� NASMͨ��������ջ�ṩ�������ϵĹ��ܡ�Ԥ������ά����һ���������� �ĵ�ջ��ÿһ�������Ķ���һ��������Ϊ��ʶ�������ͨ��ָ��'%push' ��������ջ�м�һ���µ������ģ���ͨ��'%pop'ȥ��һ��������Զ���һ Щֻ����ض���������˵�DZ��ص�labels�� 4.7.1 `%push' and `%pop': ������ɾ�������ġ� '%push'��������������һ���µ������ģ�Ȼ���������������ջ�Ķ��ˡ� '%push'��Ҫһ��������������������ĵ����֣����磺 %push foobar ����һ���µĽ���'foobar'�������ķŵ�ջ�����������һ��ջ��ӵ�� ���������ͬ���ֵ������ģ�����֮���Ծ��ǿ������ֵġ� ������'%pop'����Ҫ������ɾ��ջ���������ģ����������٣�ͬʱҲɾ�� ������ص�labels�� 4.7.2 Context-Local Labels ����'%%foo'�ᶨ��һ�����������ڵ��Ǹ��������DZ��ص�labelһ���� '%$foo'�ᶨ��һ�����ڵ�ǰջ���������������DZ��ص�lable�����ԣ��� ���ᵽ��'REPEAT','UNTIL'�����ӿ���������ķ�ʽʵ�֣� %macro repeat 0 %push repeat %$begin: %endmacro %macro until 1 j%-1 %$begin %pop %endmacro Ȼ������������ʹ������ mov cx,string repeat add cx,3 scasb until e ����ɨ��ÿ���ַ����еĵ��ĸ��ֽڣ��Բ�����al�е��ֽڡ� �������Ҫ���壬���ȡ���ڲ���ջ���������ı��ص�label�������ʹ�� '%$$foo',��'%$$$foo'����ȡջ����������ġ� 4.7.3 Context-Local���кꡣ NASMҲ�����㶨�����һ���ض����������DZ��صĵ��к꣬ʹ�õķ�ʽ���� ���棺 %define %$localmac 3 ��ᶨ��һ������ջ���������ı��صĵ��к�'%$localmax',��Ȼ������һ�� '%push'����֮�������ǿ���ͨ��'%$$localmac'����ȡ�� 4.7.4 `%repl': ��һ�������ĸ����� �������Ҫ�ı�һ��ջ�������ĵ����֣����磬Ϊ����Ӧ'%ifctx')������� ��'%pop'֮�������һ��'%push'���������������ЧӦ�����ƻ����еĸ�ջ ����������ص�context-local labels�ͺꡣ NASM�ṩ��һ��������'%repl',�������ڲ�Ӱ����صĺ���labels������£� Ϊһ�������Ļ�һ�����֣���������԰�������ƻ��Դ����滻����һ���� ʽ�� %pop %push newname ���ɲ����ƻ��Եİ汾�� `%repl newname'. 4.7.5 ʹ��������ջ������: Block IFs ������Ӽ���ʹ�������е�������ջ�����ԣ������������ṹ'%ifctx'�� ����һ����IF�����Ϊһ�׺���ִ�У� %macro if 1 %push if j%-1 %$ifnot %endmacro %macro else 0 %ifctx if %repl else jmp %$ifend %$ifnot: %else %error "expected `if' before `else'" %endif %endmacro %macro endif 0 %ifctx if %$ifnot: %pop %elifctx else %$ifend: %pop %else %error "expected `if' or `else' before `endif'" %endif %endmacro ��δ��뿴��ȥ�������`REPEAT'��`UNTIL'��Ҫ�������ˡ���Ϊ��ʹ���� �������ȥ��֤������ȷ��˳��ִ�У����磬������'if'֮�����'endif' )������ִ���ִ��'%error'�� ���⣬'endif'��Ҫ�������ֲ�ͬ���������������ֱ�Ӹ���'if'���棬Ҳ ���ܸ���'else'���档��Ҳ��ͨ��������࣬�ж�������ջ��ջ����'if'�� ��'else',���ݴ���ִ�в�ͬ�Ķ����� 'else'�����������ı��浽ջ�У�����'if'���'endif'���ж���� '%$ifnot'���á�������ı������ĵ����֣�����'endif'�Ϳ���֪�����м� ����һ��'else'������ͨ��'%repl'�����������ġ� ������һ��ʹ����Щ�������: cmp ax,bx if ae cmp bx,cx if ae mov ax,cx else mov ax,bx endif else cmp ax,cx if ae mov ax,cx endif endif ͨ�������ڲ�'if'����������һ��������ѹջ���������'if'�е������� �����棬������'else'��'endif'�������õ�ƥ���'if'��'else'����� ��-'IF'�괦��Ƕ�׵������൱�ã� 4.8 ��׼�ꡣ NASM������һ�ױ�׼�꣬����ʼ����Դ�ļ�ʱ����Щ�궼�Ѿ��������ˡ� ��������ϣ��һ��������ִ��ǰû��Ԥ����ĺ���ڣ������ʹ�� '%clear'���������Ԥ��������һ�С� ������û����IJ������������£�����Ϊ�������еģ���Щ���һ������ԭ ʼ�IJ���������Щ�ڵ����½��ܡ�ʣ��ı�׼����������������� 4.8.1 `__NASM_MAJOR__', `__NASM_MINOR__', `__NASM_SUBMINOR__'�� `___NASM_PATCHLEVEL__': NASM�汾�ꡣ ���к�`__NASM_MAJOR__', `__NASM_MINOR__',`__NASM_SUBMINOR__'�� `___NASM_PATCHLEVEL__'��չ���ɵ�ǰʹ�õ�NASM�����汾��,�ΰ汾�ţ� �Ӵΰ汾�źͲ����������ڣ���NASM 0.98.32p1�汾�У�`__NASM_MAJOR__' ��չ����0��`__NASM_MINOR__'��չ����98��`__NASM_SUBMINOR__'��չ���� 32��`___NASM_PATCHLEVEL__'������Ϊ1�� 4.8.2 `__NASM_VERSION_ID__': NASM�汾ID�� ���к�`__NASM_VERSION_ID__'��չ����˫����������������ǰʹ�õİ汾 ��NASM��ȫ�汾�������ֵ���ڰ�`__NASM_MAJOR__',`__NASM_MINOR__', `__NASM_SUBMINOR__'��`___NASM_PATCHLEVEL__'������������һ�������� ˫�ֳ������������ԣ�����0.98.32p1,����ֵ����� dd 0x00622001 ���� db 1,32,98,0 ע�⣬�������д������������ȫ��ͬ�Ĵ��룬�ڶ���ֻ������ָ���ڴ� �д��ڵĸ���ֵ֮���˳�� 4.8.3 `__NASM_VER__': NASM�汾�ַ����� ���к�`__NASM_VER__'��չ����һ���ַ������������˵�ǰʹ�õ�NASM�� �汾�š����ԣ���NASM0.98.32�£� db __NASM_VER__ �ᱻչ���ɣ� db "0.98.32" 4.8.4 `__FILE__' and `__LINE__': �ļ������кš� ����C��Ԥ��������NASM�����û��ҵ������е�ǰָ����ļ����ļ������� ������'__FILE__'չ����һ���ַ����������ó���������ǰ�����ļ����ļ� ��(�������'%include'�����������ֵ���ڻ��Ĺ����иı�)���� `__LINE__'�ᱻչ����һ����ֵ�����������������ļ��еĵ�ǰ�е��кš� ��Щ�����ʹ���ں��У��Բ鿴������Ϣ������һ���궨���а����� '__LINE__'ʱ������ �ǵ��л��Ƕ��У����᷵�غ���ã������Ǻ궨�崦 ���кš����������ȷ���Ƿ���һ�δ����з����˳�����������磬ij�� ���Ա�дһ���ӹ���'stillhere',��ͨ��'EAX'����һ���кţ�Ȼ�����һ Щ��Ϣ������:"line 155: still here'�������������д�꣺ %macro notdeadyet 0 push eax mov eax,__LINE__ call stillhere pop eax %endmacro Ȼ������Ĵ����в������ã�ֱ���㷢�ַ�������Ĵ���Ϊֹ�� 4.8.5 `STRUC' and `ENDSTRUC': ����һ���ṹ���������͡� ��NASM���ڲ���û�����������ϵĶ���ṹ���������͵Ļ��ƣ� ȡ������ �ǣ�Ԥ�������Ĺ����൱ǿ�󣬿��԰ѽṹ������������һ�׺����ʽ�� ���С��� ��STRUCT�� ��'ENDSTRUC'����������һ���ṹ���������͵ġ� ��STRUCT������һ�����������ǽṹ������֡�������ִ����ṹ�屾������ �ڽṹ���ڵ�ƫ�Ƶ�ַΪ�㣬���ּ���һ��_size��׺��ɵķ��ţ���һ�� 'EQU'�������Ͻṹ��Ĵ�С��һ����STRUC'��ִ�У���Ϳ�ʼ�ڶ���һ�� �ṹ�壬�������'RESB'��αָ���ṹ�����,Ȼ��ʹ��'ENDSTRUC'�� �������塣 ���磬����һ������'mytype'�Ľṹ�壬����һ��longword,һ��word,һ�� byte,��һ���ַ��������������д���룺 struc mytype mt_long: resd 1 mt_word: resw 1 mt_byte: resb 1 mt_str: resb 32 endstruc ����Ĵ��붨�����������ţ�'m_long'�ڵ���0(�ӽṹ��'mytype'��ͷ��ʼ �����longword���ƫ��),`mt_word'�ڵ���4, `mt_byte'6, `mt_str'7, `mytype_size'��39,��`mytype' �Լ��ڵ���0 ֮����Ҫ�ѽṹ������ֶ����ڵ�ַ�㴦������ΪҪ�ýṹ�����ʹ�ñ��� labels���Ƶ�Ե�ʣ��������Ҫ�ڶ���ṹ����ʹ�þ���ͬ�����ֵij�Ա�� ����԰�����Ľṹ�嶨���������ӣ� struc mytype .long: resd 1 .word: resw 1 .byte: resb 1 .str: resb 32 endstruc ����������У��ѽṹ�����ƫ��ֵ������ˣ�'mytype.long', `mytype.word', `mytype.byte' and `mytype.str'. NASM��˶�û���ڲ��Ľṹ��֧�֣�Ҳ��֧���Ծ����ʽ���ýṹ���еij� Ա�����Դ���'mov ax, [mystruc.mt_word]���ǷǷ��ģ�'mt_word'��һ�������� �����������͵ij���һ�������ԣ���ȷ���﷨Ӧ���� 'mov ax,[mystruc+mt_word]'����`mov ax,[mystruc+mytype.word]'. 4.8.6 `ISTRUC', `AT' and `IEND': �����ṹ���һ��ʵ���� ������һ���ṹ�������Ժ�����һ��Ҫ������������������������ݶ� ������һ���ṹ���ʵ����NASMͨ��ʹ��'ISTRUC'�����ṩһ�ַdz��� �ķ�ʽ���ڳ���������һ��'mytype'�ṹ�壬���������������д���룺 mystruc: istruc mytype at mt_long, dd 123456 at mt_word, dw 1024 at mt_byte, db 'x' at mt_str, db 'hello, world', 13, 10, 0 iend ��AT����Ĺ�����ͨ��ʹ��'TIMES'ǰ׺��ƫ��λ�ö�λ����ȷ�Ľṹ�����ϣ� Ȼ������һ���ض������ݡ����ԣ��ṹ����������ڽṹ�嶨������ͬ�� ˳�������� ���Ϊ�ṹ�����ֵҪ����һ�У��ǽ��µ����ݿ�ֱ�Ӹ���'AT'�к��棬�� �磺 at mt_str, db 123,134,145,156,167,178,189 db 190,100,0 �����˵�ϲ�ò�ͬ����Ҳ���Բ���'AT'����д���ݣ���ֱ���ڵڶ��п�ʼд ������ at mt_str db 'hello, world' db 13,10,0 4.8.7 `ALIGN' and `ALIGNB': ���ݶ��� ��'ALIGN'��'ALIGNB'�ṩһ�ֱ�ݵķ�ʽ���������ݻ��������֣�˫�֣��� �������߽��ϵĶ���(��Щ������������������'EVEN')���й�����������﷨ �ǣ� align 4 ; align on 4-byte boundary align 16 ; align on 16-byte boundary align 8,db 0 ; pad with 0s rather than NOPs align 4,resb 1 ; align to 4 in the BSS alignb 4 ; equivalent to previous line ��������������Ҫ�����ǵĵ�һ��������2���ݣ����Ƕ��������Ҫ�����ֽ��� ���洢��ǰ�Σ���Ȼ����ֽ����������϶��뵽һ��2����ֵ��Ȼ�������ǵĵ� ����������ִ��'TIMES'ǰ׺���ж��롣 ����ڶ�������û�б�ָ������'ALIGN'��ȱʡֵ����'NOP',��'ALIGNB'��ȱʡ ֵ����'RESB 1'.���ڶ���������ָ��ʱ�����������ǵ�Ч�ġ�ͨ����������� ���ݶ���������ʹ��'ALIGN',����BSS����ʹ��'ALIGNB',������������;��һ ���㲻��Ҫ�ڶ��������� ��Ϊ�����򵥵ĺ꣬'ALIGN'��'ALIGNB'��ִ�д����飺������ǵĵ�һ���� ������2��ij�η��������ǵĵڶ�����������һ���ֽڵĴ��룬���Ƕ������о� ����Ϣ������������£����Ƕ���ִ�д��� 'ALIGNB'(���ߣ�'ALIGN'���ϵڶ�������'RESB 1')�������ڽṹ��Ķ����У� struc mytype2 mt_byte: resb 1 alignb 2 mt_word: resw 1 alignb 4 mt_long: resd 1 mt_str: resb 32 endstruc ����Ա�֤�ṹ��ij�Ա�����뵽���ṹ��Ļ���ַ֮����һ����ȷ��ƫ��ֵ�� �����Ҫע����ǣ�'ALIGN'��'ALIGNB'�����ԶεĿ�ʼ��ַ��Ϊ�ο��ģ��� ����������ִ�г���ĵ�ַ�ռ䡣��������ڵĶ�ֻ�ܱ�֤���뵽4�ֽڵı� �磬����������16�ֽڵı߽磬�������˷ѣ����⣬NASM������εĶ� �������Ƿ�ɱ�'ALIGN'��'ALIGNB'ʹ�á� 4.9 TASM����Ԥ����ָ� ��������Ԥ����������ֻ������'-t'�����п��ذ�TASM����ģʽ�򿪵������ �ſ���ʹ��(���������2.1.16���ܹ�) (*) `%arg' (��4.9.1��) (*) `%stacksize' (��4.9.2��) (*) `%local' (��4.9.3��) 4.9.1 `%arg'������ '%arg'������������ջ�ϵIJ������ݲ�������������ջ�IJ��������ںܶ�� �������б�ʹ�ã�����C��C++��Pascal�� ��NASM��ͼͨ������ʵ�����ֹ���(����7.4.5)�������﷨ʹ���ϲ��Ǻ������ ���Ҹ�TASM֮���Dz����ݵġ�������һ�����ӣ�չʾ��ֻͨ����'%arg'�������� some_function: %push mycontext ; save the current context %stacksize large ; tell NASM to use bp %arg i:word, j_ptr:word mov ax,[i] mov bx,[j_ptr] add ax,[bx] ret %pop ; restore original context �����7.4.5�ж���Ĺ��̺����ƣ���j_ptrָ���ֵ�ӵ�i�У�Ȼ�����ӵĽ� ����AX�з��أ�����'push'��'pop'��չ�������4.7.1����������ջ��ʹ�á� 4.9.2 `%stacksize'ָ� '%stacksize'ָ���Ǹ�'%arg'��'%local'ָ��������ʹ�õġ�������NASM Ϊ'%arg'��'%local'ʹ�õ�ȱʡ��С��'%stacksize'ָ�����һ���������� ��'flat','large'��'small'�� %stacksize flat ������ʽ��ʹNASMʹ�������'ebp'�Ļ���ջ�IJ�����ַ��������ʹ��һ�� ���������õ������������(���磬eip��ѹջ). %stacksize large ��������ʽ����'bp'�����л���ջ�IJ���Ѱַ������ʹ����һ��Զ������ ��������ַ(���磬ip��cs���ᱻѹջ)�� %stacksize small ������ʽҲʹ��'bp'�����л���ջ�IJ���Ѱַ��������'large'��ͬ����Ϊ ������bp�ľ�ֵ�Ѿ���ѹջ�����仰˵�������bp,ip��cs����ջ���������� ��������б��ؿռ��Ѿ���'ENTER'ָ��ٺ��ˡ�����'%local'ָ���ϵ� ʱ��������ʽ�ر����á� 4.9.3 `%local'ָ� '%local'ָ����������ջ����н��б�����ʱջ�����ķ��䡣C�����е��� �����ر������������ͱ�����һ�����ӡ�'%local'ָ���'%stacksize'һ�� ʹ�õ�ʱ���ر����á�����'%arg'ָ��ּ��ݡ���Ҳ�����򻯶�����Щ�� 'ENTER'ָ�������ջ�еı���������(����ENTERָ���ο�B.4.65)���� ����һ���������ǵ�ʹ�õ����ӣ� silly_swap: %push mycontext ; save the current context %stacksize small ; tell NASM to use bp %assign %$localsize 0 ; see text for explanation %local old_ax:word, old_dx:word enter %$localsize,0 ; see text for explanation mov [old_ax],ax ; swap ax & bx mov [old_dx],dx ; and swap dx & cx mov ax,bx mov dx,cx mov bx,[old_ax] mov cx,[old_dx] leave ; restore old bp ret ; %pop ; restore original context ����'%$localsize'����'%local'���ڲ�ʹ�ã����ұ�����'%local'ָ��ʹ��ǰ�� �������ڵ�ǰ���������С�������������ÿһ��'%local'���������ĵط����� ��һ������ʽ�﷨������Ȼ���������һ���ʵ���ENTERָ���С� 4.10 ������Ԥ����ָ� NASM����һЩԤ����ָ���������ⲿԴ�л�ȡ��Ϣ�����ڣ����ǰ����� �����Ԥ����ָ��ʹNASM����ȷ������C++/C����Ԥ������������� (*) `%line' ʹNASM����ȷ������C++/C����Ԥ�������������(����4.10.1) (*) `%!' ʹNASM��һ�����������ж�ȡ��Ϣ��Ȼ����Щ��Ϣ�Ϳ�������ij��� ��ʹ���ˡ�(4.10.2) 4.10.1 `%line'�������� '%line'������������֪ͨNASM������������һ���ļ���ָ�����к���ء�һ�� ����һ���ļ�����һ��Դ�����ļ�������Ϊ����NASM�����룬������һ��Ԥ���� ���������'%line'ָ������NASM������������Դ�����ļ��е�ָ���кŵ��� Ϣ�������DZ�NASM�������������ļ��� ���Ԥ����ָ��ͨ�����ᱻ����Ա�õ���������Ԥ�����������߸���Ȥ��'%line' ��ʹ�÷������£� %line nnn[+mmm] [filename] �����ָ���У�'nnn'ָ��Դ�����ļ�����֮��ص��ض��У�'mmm'��һ����ѡ�� ��������ָ��һ���е�����ֵ��ÿһ������������Դ�ļ��б���Ϊ��Դ�����ļ� �е�'mmm'����ء����գ�'filename'��ѡ����ָ��Դ�����ļ����ļ����� �ڶ���һ��'%line'Ԥ����ָ���NASM�ᱨ����ָ����ֵ��ص����е��ļ����� �к� 4.10.2 `%!'`': ��ȡһ������������ `%!' �����������ڻ��ʱ��ȡһ������������ֵ�����������һ���������� �����ݱ��浽һ���ַ����С����ַ����������������������ط��� ���磬��������һ����������'FOO',��ϣ����'FOO'��ֵǶ�뵽��ij�����ȥ����� ���������� %define FOO %!FOO %define quote ' tmpstr db quote FOO quote ��д��ʱ���ڶ���'quote'ʱ���������һ��'û�н������ַ���'�ľ�����Ϣ, �����Լ��ڶ��������ַ�����ǰ�����һ���ո���û�а취�ҵ�һ���򵥵� ������ʽ(���ܿ���ͨ����������)������Ϊ����û�б�Ҫѧϰ������Ϊ���� �ĺ꣬��������������ַ�ʽʹ��������ԣ���û�б�Ҫʹ�ö���Ŀռ䡣 ������: �����ָ� ------------------------------- ����NASM��������MASN��TASM�е���Щӹ�׸��ӵĶ����������Dz��ò�֧���� ����ָ���Щָ���ڱ��½��������� NASM��ָ�����������ͣ��û���ָ���ԭʼָ�һ��أ�ÿһ��ָ���һ ���û�����ʽ��ԭʼ��ʽ���ڴ��������£������Ƽ��û�ʹ���л���ָ� �����Ժ����ʽ���У���ȥ����ԭʼ��ʽ��ָ� ԭʼָ�������һ���������У��û���ָ��û�����š� ���˱�������������Щͨ�õ�ָ�ÿһ��Ŀ���ļ���ʽΪ�˿����ļ���ʽ ��һЩ���ԣ�����ʹ��һЩ�����ָ���Щ��ʽ��ص�ָ���ڵ������и� ��ص��ļ���ʽһ����н��ܡ� 5.1 `BITS': ָ��Ŀ�괦����ģʽ�� 'BITS'ָ��ָ��NASM�����Ĵ����DZ����������16λģʽ�Ĵ������ϻ������� ��32λģʽ�Ĵ������ϡ��﷨��'BITS 16'��'BITS 32' ���������£�����ܲ���Ҫ��ʽ��ָ��'BITS'��'aout','coff','elf'�� 'win32'Ŀ���ļ���ʽ���DZ��������32λ����ϵͳ�ϵģ����ǻ���NASMȱ ʡѡ��32λģʽ����'obj'Ŀ���ļ���ʽ������Ϊÿһ����ָ��'USE16'�� 'USE32'��Ȼ��NASM�ͻᰴ���ָ���趨����ģʽ�����Զ��ʹ��'BITS'�� û�б�Ҫ�ġ� ���п���ʹ��'BITS'�ij�������һ�����������ļ���ʹ��32λ���룻������ Ϊ'bin'�����ʽ����ΪDOS��'.COM'����DOS��'.SYS'�豸�������򣬻��� ������ʱ��Ĭ�϶���16λģʽ�� ����������Ϊ����16λ��DOS������ʹ��32λָ��㲻��ָ��'BITS 32'�� ������������ˣ�������������������Ĵ��룬��Ϊ����������������� 16λģʽ�£�ȴ��32λƽ̨ΪĿ��Ĵ��롣 ��NASM��'BITS 16'״̬��ʱ��ʹ��32λ���ݵ�ָ����Լ�һ���ֽڵ�ǰ׺ 0x66��Ҫʹ��32λ�ĵ�ַ�����Լ���0x67ǰ׺����'BITS 32'״̬�£��෴�� ���������32λָ���Ҫǰ׺����ʹ��16λ���ݵ�ָ����Ҫ0x66ǰ׺��ʹ ��16λ��ַ��ָ����Ҫ0x67ǰ׺�� 'BITS'ָ��ӵ��һ����Ч��ԭʼ��ʽ��[BITS 16]��[BITS 32]�����û����� ��ʽֻ��һ����������ԭʼ��ʽ�ĺꡣ 5.1.1 `USE16' & `USE32': BITS�ı����� 'USE16'��'USE32'ָ���������ȡ��'BITS 16'��'BITS 32',����Ϊ�˺����� ��������ּ����ԡ� 5.2 `SECTION'��`SEGMENT': �ı�Ͷ���Ρ� 'SECTION'ָ��('SEGMENT'������ȫ��Ч)�ı�������д�Ĵ��뽫�������ĶΡ� ��ijЩĿ���ļ���ʽ�У��ε�������������ȷ���ģ����ڱ�һЩ��ʽ�У��û� ���Խ��������ĶΡ���ˣ��������ͼ�л���һ�������ڵĶΣ�'SECTION'�� ʱ���ܻ����������Ϣ�����߶����һ���¶Σ� Unix��Ŀ���ļ���ʽ��'bin'Ŀ���ļ���ʽ����֧�ֱ�׼�Ķ�'.text','.data' ��'bss'�Σ���֮��ͬ�ĵģ�'obj'��ʽ���ܱ�ʶ����Ķ���������Ҫ�Ѷ����� ͷ�ľ��ȥ���� 5.2.1 �� `__SECT__' 'SECTION'ָ���һ��ָ��������ͬ�����û�����ʽ������ԭʼ��ʽ�ڹ������� ����ͬ��ԭʼ��ʽ[SECTION xyz],�򵥵��л���������Ŀ��Ρ��û�����ʽ�� 'SECTION xyz'�ȶ���һ�����к�'__SECT__',����Ϊԭʼ��ʽ[SECTION]������ ��Ҫִ�е�ָ�Ȼ��ִ���������ԣ��û���ָ� SECTION .text ��չ�������У� %define __SECT__ [SECTION .text] [SECTION .text] �û��ᷢ���������Լ��ĺ��У����Ƿdz����õġ����磬4.3.3�ж���ĺ� 'writefile'������ĸ�Ϊ���µ�д��������ã� %macro writefile 2+ [section .data] %%str: db %2 %%endstr: __SECT__ mov dx,%%str mov cx,%%endstr-%%str mov bx,%1 mov ah,0x40 int 0x21 %endmacro �����ʽ�ĺ꣬һ�δ���һ���ó�������ַ���������ԭʼ��ʽ��'SECTION'�� ������ʱ�����ݶΣ������Ͳ����ƻ��'__SECT__'��Ȼ�����������ַ��������� ���ݶ��У�Ȼ�����'__SECT__'�л����û���ǰ���ڵĶΡ������Ϳ��Ա�����ǰ �汾��'writefile'���е������������ݵ�'JMP'ָ�������һ����Ϊ���ӵĸ� ʽģ����Ҳ����ʧ�ܣ��û����԰����������κζ����Ĵ�����н��л�ࡣ 5.3 `ABSOLUTE': �������labels�� 'ABSOLUTE'���������Ա���Ϊ��'SECTION'����һ����ʽ�������ý������Ĵ��벻 ���κε��������У�������һ���Ӹ�����ַ��ʼ�ļ�����С�������ģʽ�У��� Ψһ��ʹ�õ�ָ����'RESB'��ָ� `ABSOLUTE'��������������ʹ��: absolute 0x1A kbuf_chr resw 1 kbuf_free resw 1 kbuf resw 16 �������������һ�������ڶε�ַ0x40����PC BIOS������ĶΣ�����Ĵ���� 'kbuf_chr'������0x1A����'kbuf_free'�����ڵ�ַ0x1C����'kbuf'�����ڵ�ַ 0x1E�� ����'SECTION'һ�����û�����'ABSOLUTE'��ִ��ʱ���ض���'__SECT__'�ꡣ 'STRUC'��'ENDSTRUC'�������ʹ��'ABSOLUTE'�ĺ꣨ͬʱҲʹ����'__SECT__'�� 'ABSOLUTE'��һ����Ҫ����һ�����Գ�����Ϊ��������Ҳ���Դ���һ������ʽ�� ʵ������һ���ٽ����ʽ������3.8��������ʽ��ֵ��������һ�����С����磬һ ��TSR������������������������ô�����ռ�Ŀռ䣺 org 100h ; it's a .COM program jmp setup ; setup code comes last ; the resident part of the TSR goes here setup: ; now write the code that installs the TSR here absolute setup runtimevar1 resw 1 runtimevar2 resd 20 tsr_end: �����setup�εĿ�ʼ������һЩ���������ԣ���setup�����������ռ�õ��ڴ� �ռ���Ա���ΪTSR�����ݴ洢��ݷ���õ����á�����'tsr_end'������������TSR ��������ռ�ÿռ�Ĵ�С�� 5.4 `EXTERN': ��������ģ���е�����С� 'EXTERN'��MASM�IJ�����'EXTRN'��C�Ĺؼ���'extern'�������ƣ�������������һ �����ţ���������ڵ�ǰģ����û�б����壬������Ϊ�Ƕ�����������ģ���У��� ��Ҫ�ڵ�ǰģ���ж������á��������е�Ŀ���ļ���ʽ��֧���ⲿ�����ģ�'bin'�� ����ʽ�Ͳ��С� 'EXTERN'���������Դ���������������ÿһ������һ���������� extern _printf extern _sscanf,_fscanf ��ЩĿ���ļ���ʽΪ'EXTERN'�ṩ�˶�������ԡ�����������£�Ҫʹ����Щ���� ���ԣ������ڷ����������һ��ð�ţ�Ȼ�����Ŀ���ļ���ʽ��ص�һЩ���֡����� 'obj'�ļ���ʽ����������һ�����ⲿ��'dgroup'Ϊ�λ�ַһ���������������������� д�� extern _variable:wrt dgroup ԭʼ��ʽ��'EXTERN'���û�������ʽ������ͬ����Ϊ��ֻ�ܴ���һ�����������ڶ���� ����֧������Ԥ���������ϵ����ԡ� ����԰�ͬһ��������Ϊ'EXTERN'������Σ�NASM����Ե��ڶ��κͺ��������ģ�ֻ�� �õ�һ�������㲻����������������һ������һ��'EXTERN'������ 5.5 `GLOBAL': �ѷ��ŵ���������ģ���С� 'GLOBAL'��'EXTERN'�Ķ����棺���һ��ģ������һ��'EXTERN'�ķ��ţ�Ȼ���������� Ȼ��Ϊ�˷�ֹ���Ӵ�������ijһ��ģ�����ȷʵ�����˸÷��ţ�Ȼ���������Ϊ 'GLOBAL',��Щ�����ʹ������'PUBLIC'�� 'GLOBAL'�����������õķ��ű�����'GLOBAL'֮����ж��塣 'GLOBAL'ʹ�ø�'EXTERN'��ͬ���﷨�������������õķ��ű�����ͬһ��ģ�����Ѿ��� ������ˣ����磺 global _main _main: ; some code ����'EXTERN'һ����'GLOBAL'����Ŀ���ʽ�ļ�ͨ��ð�Ŷ��������Լ�����չ������ 'elf'Ŀ���ļ���ʽ��������ָ��ȫ�������Ǻ��������ݡ� global hashlookup:function, hashtable:data ����'EXTERN'һ����ԭʼ��ʽ��'GLOBAL'���û�������ʽ��ͬ������һ�δ���һ���� �� 5.6 `COMMON': ����ͨ�������� 'COMMON'����������������ͨ�ñ�����һ��ͨ�ñ�������һ���ڷdz�ʼ�����ݶ��ж��� ��ȫ�ֱ��������ԣ� common intvar 4 �����ϸ�����Ĵ������ƣ� global intvar section .bss intvar resd 1 ��ͬ�����������һ����ģ�鶨������ͬ��ͨ�ñ�����������ʱ����Щͨ�ñ����ᱻ �ϲ���Ȼ������ģ���е����еĶ�'intvar'�����û�ָ��ͬһƬ�ڴ档 �ͽ�'GLOBAL'��'EXTERN','COMMON'֧��Ŀ���ļ��ض�����չ�����磬'obj'�ļ���ʽ ����ͨ�ñ���ΪNEAR��FAR,��'elf'��ʽ������ָ��ͨ�ñ����Ķ�����Ҫ�� common commvar 4:near ; works in OBJ common intarray 100:4 ; works in ELF: 4 byte aligned ����ԭʼ��ʽҲֻ�ܴ���һ�������� 5.7 `CPU': ����CPU��ء� 'CPU'ָ������ֻ�������ض�CPU�����ϵ�ָ� ѡ������: (*) `CPU 8086' ֻ���8086��ָ��� (*) `CPU 186' ���80186�������µ�ָ��� (*) `CPU 286' ���80286�������µ�ָ��� (*) `CPU 386' ���80386�������µ�ָ��� (*) `CPU 486' 486ָ��� (*) `CPU 586' Pentiumָ��� (*) `CPU PENTIUM' ͬ586�� (*) `CPU 686' P6ָ��� (*) `CPU PPRO' ͬ686 (*) `CPU P2' ͬ686 (*) `CPU P3' Pentium III and Katmaiָ��� (*) `CPU KATMAI' ͬP3 (*) `CPU P4' Pentium 4 (Willamette)ָ� (*) `CPU WILLAMETTE' ͬP4 (*) `CPU IA64' IA64 CPU (x86ģʽ��)ָ� ����ѡ��Ǵ�Сд�����еģ���ָ��CPU�����һ��CPU�ϵ�����ָ��� ��ѡ��ȱʡ����£�����ָ��ǿ��õġ� ������: ����ļ��ĸ�ʽ�� ------------------------- NASM��һ������ֲ�Ļ�������������Ϊ�������κ�ANSI C������֧�ֵ�ƽ̨ �ϱ����룬�����Բ����ڸ���intel x86ϵ���IJ���ϵͳ�����еĴ��롣Ϊ�� ������һ�㣬��ӵ�д����Ŀ��õ�����ļ���ʽ��ʹ���������ϵ�ѡ��'-f' ����ѡ��ÿһ�ָ�ʽ����NASM���﷨����һ������չ�������ⲿ�����ݣ� ���½���ϸ���ܡ� ������2.1.1���������ģ�NASM���������ļ������ֺ���ѡ�������ļ��ĸ� ʽΪ�������ļ�ѡ��һ��ȱʡ�����֡�����ͨ��ȥ��Դ�ļ�����չ��('.asm ��'.s'����������ʹ�õ���չ��)��Ȼ���֮��һ��������ļ���ʽ�������� չ������Щ�����ʽ��ص���չ����������һһ������ 6.1 `bin': �������Ƹ�ʽ����� 'bin'��ʽ������Ŀ���ļ����������д����Щ���룬����������ļ��в��� �κζ��������ִ������Ƹ�ʽ���ļ���������MS-DOS�У�'.COM'��ִ���ļ� ��'.SYS'�豸����������Ǵ������Ƹ�ʽ�ġ��������Ƹ�ʽ������ڲ���ϵ ͳ���������򿪷�Ҳ�Ǻ����õġ� 'bin'��ʽ֧�ֶ������������NASM����'bin'��ʽ�еĶε�ϸ�ڣ������ 6.1.3�� ʹ��'bin'��ʽ����NASM����ȱʡ��16λģʽ (����5.1)��Ϊ������'bin'�� ʽ��ʹ��32λ���룬�����ڲ���ϵͳ���ں˴����С��������ʽ��ʹ�� 'BITS 32'�������� 'bin'û��ȱʡ������ļ���չ������ֻ�ǰ������ļ�����չ��ȥ������Ϊ ����ļ������֡�������NASM��ȱʡģʽ�»��'binprog.asm'���ɶ��� ���ļ�'binprog'�� 6.1.1 `ORG': �����Ƴ�������λ�á� 'bin'��ʽ�ṩһ������IJ����������ڵ������Ѿ�����'ORG'.'ORG'�Ĺ��� ��ָ�����������ڴ�ʱ��������ʼ��ַ�� ���磬����Ĵ�������longword: `0x00000104': org 0x100 dd label label: ��MASM���ݻ�����ṩ��'ORG'��������ͬ��������������Ŀ���ļ�����ת�� �����ǵ����Ѿ������Ĵ��룬��NASM��'ORG'��������������˼����㡱�� ��ʾ�ģ����Ĺ��ܾ���Ϊ�����ڲ��ĵ�ַ��������һ������ƫ��ֵ�������� ��MASM�汾��'org'���κ��������ܡ� 6.1.2 `bin'��`SECTION'����������չ�� 'bin'�����ʽ��չ��'SECTION'(����'SEGMENT')��������������ָ���ε� ������������ͨ���ڶζ����еĺ������'ALIGN'�޶���ʵ�ֵġ����磺 section .data align=16 ���л�����'.data',��ָ����������뵽16�ֽڱ߽硣 'ALIGN'�IJ���ָ���˵�ֵַ�ĵ�λ�ж���λ����Ϊ�㡣�������ֵ����Ϊ 2���ݡ� 6.1.3 `Multisection' ֧��BIN��ʽ. 'bin'��ʽ����ʹ�ö���Σ���Щ����һЩ�ض��Ĺ���������С� (*) �κ���һ����ʽ��'SECTION'������֮ǰ�Ĵ��붼��ȱʡ�ؼӵ�'.text' ���С� (*) ���'.text'����û�и���'ORG'��䣬����ȱʡ�ظ�Ϊ'ORG 0'�� (*) ��ʽ�ػ���ʽ�غ���'ORG'���Ķλ���'ORG'ָ���ķ�ʽ��š����� ǰ�����0����������ļ�������orgָ����ƫ�ơ� (*) ���һ�����ں��ж��'ORG'��䣬���һ��'ORG'���ᱻ���õ��� �����У�����Ӱ����ڶ��������һ����˳��ŵ�һ�� (*) û��'ORG'�Ķλᱻ�ŵ���'ORG'�Ķεĺ��棬Ȼ�����Ǿ��Ե�һ���� ��ʱ��˳�򱻴�š� (*) '.data'�β���'.text'�κ�'.bss'��������������ѭ�κι��� (*) '.bss'�λᱻ�������������εĺ��档 (*) ����һ�����߼���Ķ��뱻ָ�������еĶζ������뵽˫�ֱ߽硣 (*) ��֮�䲻���Խ����� 6.2 `obj': ΢��OMFĿ���ļ� 'obj'�ļ���ʽ����Ϊ��ʷ��ԭ��NASM����'obj'������'omf')��MASM�� TASM���Բ�����һ�ָ�ʽ�����DZ�׼���ṩ��16λ��DOS�������������� '.EXE'�ļ��ĸ�ʽ����Ҳ��OS/2ʹ�õĸ�ʽ�� 'obj'�ṩһ��ȱʡ������ļ���չ��'.obj'�� 'obj'����һ��ר�ŵ�16λ��ʽ��NASM��һ��������֧�֣�����������32λ ��չ��32λobj��ʽ���ļ���ר�Ÿ�Borland��Win32������ʹ�õģ������ ������ʹ��΢�����µ�'win32'Ŀ���ļ���ʽ�� 'obj'��ʽû�ж����ض��Ķ����֣�����԰���Ķζ�����κ���ϲ�� �����֡�һ��ģ�obj��ʽ���ļ��еĶ����磺`CODE', `DATA'��`BSS'. ������Դ�ļ�����ʽ��'SEGMENT'ǰ�����д��룬NASM��Ϊ�㴴��һ���� ��`__NASMDEFSEG'�Ķ��԰�����Щ����. ������obj�ļ��ж�����һ���Σ�NASM�Ѷ�������Ϊһ�����ţ���������� ��ȡ����εĶε�ַ�����磺 segment data dvar: dw 1234 segment code function: mov ax,data ; get segment address of data mov ds,ax ; and move it into DS inc word [dvar] ; now this reference will work ret obj��ʽ��Ҳ����ʹ��'SEG'��'WRT'�����������������������������д���룺 extern foo mov ax,seg foo ; get preferred segment of foo mov ds,ax mov ax,data ; a different segment mov es,ax mov ax,[ds:foo] ; this accesses `foo' mov [es:foo wrt data],bx ; so does this 6.2.1 `obj' ��`SEGMENT'����������չ�� obj�����ʽ��չ��'SEGMENT'(��'SECTION')��������������ָ���εĶ�� ���ԡ�����ͨ���ڶζ����е�ĩβ���Ӷ�����޶�����ʵ�ֵģ����磺 segment code private align=16 �ⶨ����һ����'code'����ͬʱ��������Ϊһ��˽�жΣ�ͬʱ������������ ������ֱ��뱻���뵽16�ֽڱ߽硣 ���õ��޶�������: (*) `PRIVATE', `PUBLIC', `COMMON'��`STACK' ָ���ε�����������`PRIVATE' ��������ʱ���������Ķν������ӣ�'PUBLIC'��'STACK'�ζ���������ʱ ���ӵ�һ�������'COMMON���ζ�����ͬһ����ַ�໥���ǣ�������һ��һ �����Ӻá� (*) ���������������ģ�'ALIGN'������ָ���λ�ַ�ĵ�λ�ж���λ����Ϊ�㣬 �����ֵ������2�ij˷�����ʽ��������1��4096��ʵ���ϣ�������֧�ֵ� ֵֻ��1��2��4��16��256��4096�����������ָ����8�������Զ����϶��� ��16��32��64����뵽128�ȵȡ�ע�⣬���뵽4096�ֽڵı߽������ָ�ʽ ��PharLap��չ���������е�����������֧�֡� (*) 'CLASS'��������ָ���ε����ͣ�������Ը�����������������ͬclass�� ��Ӧ��������ļ��б��ŵ�����ĵ�ַ��class�����ֿ������κ��֡����� 'CLASS=CODE'�� (*) ����`CLASS', `OVERLAY'ͨ��һ����Ϊ����������ָ����Ϊ��Щ�и������� ���������ṩ������Ϣ�� (*) �ο��Ա�����Ϊ'USE16'��'USE32'������ѡ����Ŀ���ļ�����Ӱ�죬ͬʱ �ڶ���16λ��32λ����ֿ���ʱ��Ҳ�ܱ�֤NASM��ȱʡ���ģʽ (*) ����дOS/2Ŀ���ļ���ʱ����Ӧ����32λ�Ķ�����Ϊ'FLAT'������ʹȱʡ �Ķλ�ַ����һ���������'FLAT'��ͬʱ��������鲻���ڵ�ʱ�򣬶����� ���顣 (*) obj�ļ���ʽҲ��������������ʱ��ǰ����һ������ľ��Զε�ַ������û ��������֪���������Ӧ����ôʹ�ã����������Ҫ�Ļ���NASM���������� ����һ������������ʽ��`SEGMENT SCREEN ABSOLUTE=0xB800'`ABSOLUTE'�� `ALIGN'�ؼ����ǻ���ġ� NASM��ȱʡ��������`PUBLIC', `ALIGN=1', û��class,û�и���, �� `USE16'. 6.2.2 `GROUP': ������顣 obj��ʽҲ�����α����飬����һ�������ĶμĴ������Ա���������һ�����е� ���жΡ�NASM����ṩ��'GROUP'���������ݴˣ����������д���룺 segment data ; some data segment bss ; some uninitialised data group dgroup data bss ��ᶨ��һ������'dgroup'���飬�����ж�'data'��'bss'������'SEGMENT', 'GROUP'�����������Ϊһ�����ţ����������ʹ��'var wrt data'����'var wrt dgroup'������'data'���еı���'var'����������һ��ȡ������һ���� ֵ����ĵ�ǰ�μĴ����С� �����ֻ��������'var',ͬʱ��'var'��������һ�����У��α�������Ϊһ�� ���һ���֣�Ȼ��NASMȱʡ�����'var'��ƫ��ֵ�Ǵ���Ļ���ַ��ʼ�ģ� �����Ƕλ�ַ�����ԣ�'SEG var'�᷵�����ַ�����Ƕλ�ַ�� NASMҲ����һ����ͬʱ��Ϊ������һ�����֣�����������������ˣ������ һ��������Ϣ������ͬʱ���ڶ�������Щ������ȱʡ״���»����ڵ�һ���� �����İ��������顣 һ����Ҳ��һ��Ҫ�����жΣ��㻹�ǿ���ʹ��'WRT'����һ���������еı����� ����˵��OS/2������һ���������'FLAT'�����������Ρ� 6.2.3 `UPPERCASE': ������ļ���ʹ��Сд������Ч�� ����NASM�Լ��Ǵ�Сд���еģ���ЩOMF������������Сд���У����ԣ���� NASM�������Сд��һ��Ŀ���ļ�������á�'UPPERCASE'�����������е�д �뵽Ŀ���ļ��е��飬�Σ�������ȫ��ǿ��Ϊ��д����һ��Դ�ļ��У�NASM ���Ǵ�Сд���еģ���Ŀ���ļ����԰�Ҫ������д���Ǵ�д�ġ� 'UPPERCASE'д�ڵ���һ���У�����Ҫ�κβ����� 6.2.4 `IMPORT': ����DLL���š� �����������NASMдһ��DLL�����,'IMPORT'���������Զ���һ����DLL���� ����ķ���,��ʹ��'IMPORT'��������ʱ��,���Ծ���Ҫ�ѷ�������Ϊ'EXTERN'. 'IMPORT'��������Ҫ��������,�Կո�ָ�,���Ƿֱ�����ϣ������ķ��ŵ��� �ƺ���ϣ������ķ������ڵĿ������,����: import WSAStartup wsock32.dll �����������ǿ�ѡ��,���Ƿ�������ϣ�����е�������ӿ��е�����,�����Ļ�, �㵼�뵽��Ĵ����еķ��ſ��ԺͿ��еķ��Ų�ͬ��,����: import asyncsel wsock32.dll WSAAsyncSelect 6.2.5 `EXPORT': ����DLL����. 'EXPORT'Ҳ��һ��Ŀ���ʽ��صIJ�����,������һ��ȫ�ַ���,������ſ��Ա� ��Ϊһ��DLL���ű�����,�������NASMдһ��DLL��.�����ʹ�����������,�� ʹ����,���Ծ���Ҫ�ѷ��Ŷ���Ϊ'GLOBAL'. 'EXPORT'����һ������,������ϣ����������Դ�ļ��ж���ķ��ŵ�����.�ڶ��� �����ǿ�ѡ��(����һ������Կո�ָ�),���������ŵ��ⲿ����,����ϣ����ʹ �����DLL��Ӧ�ó��������������ʱ���õ�����.���������ָ��ڲ�����ͬ��, ���Բ�ʹ�õڶ�������. ����һЩ���ӵIJ���,�����������嵼�����ŵ�һЩ����.����ڶ�������, ��Щ ����Ҳ���Կո�ָ�.���Ҫ������Щ����,��ô�ⲿ����Ҳ���뱻ָ��,��ʹ���� �ڲ�������ͬҲ����ʡ��,���õ���������: (*) 'resident'��ʾij������������ϵͳ������һֱ��פ�ڴ�.�����һЩ����ʹ�� �ĵ���������˵,�Ǻ����õ�. (*) `nodata'��ʾ����������һ������,���������ʹ���κ��Ѿ���ʼ����������. (*) `parm=NNN', ����'NNN'��һ��������,��������һ����32λ����16λ��֮��� ������ʱ,���������ò����ijߴ��С(ռ�ö��ٸ�wrod). (*) ����һ������,��������һ������,��ʾ���ű�����ʱ����һ����ʶ����. ����: export myfunc export myfunc TheRealMoreformalLookingFunctionName export myfunc myfunc 1234 ; export by ordinal export myfunc myfunc resident parm=23 nodata 6.2.6 `..start': ����������ڵ�. 'OMF'������Ҫ�����ӽ���������Ŀ���ļ���,��������ֻ����һ��������ڵ�, ����������ʱ,�ʹ������ڵ㿪ʼ.������������ڵ��Ŀ���ļ����� NASM����,�����ͨ������ϣ���ĵط���������'..start'��ָ����ڵ�. 6.2.7 `obj'��`EXTERN'����������չ. �����������ķ�ʽ������һ���ⲿ����: extern foo Ȼ���������ķ�ʽ����'mov ax,foo',����ֻ��õ�һ������foo��ƫ�Ƶ�ַ,���� ���ƫ�Ƶ�ַ����'foo'����ѡ�λ�ַΪ�ο���(��'foo'����������ģ����ָ�� �Ķ�).����,Ϊ�˴�ȡ'foo'������,��ʵ������Ҫ������: mov ax,seg foo ; get preferred segment base mov es,ax ; move it into ES mov ax,[es:foo] ; and use offset `foo' from it ���ַ�ʽ�Ե������е㱿׾,ʵ���������֪��һ���ⲿ���ſ���ͨ�������Ķ� ���������д�Ļ�,�ٶ���'dgroup'�Ѿ���DS�Ĵ�����,���������д����: mov ax,[foo wrt dgroup] ����,�����ÿ��Ҫ��ȡ'foo'��ʱ��,��Ҫ����ô������һ����ʹ�������;���� NASM����������'foo'����һ����ʽ: extern foo:wrt dgroup ������ʽ��NASM�ٶ�'foo'����ѡ�λ�ַ��'dgroup';����,����ʽ'seg foo'���ڻ� ����'dgroup',����ʽ'foo'��ͬ��'foo wrt dgroup'. ȱʡ��'WRT'���ƿ����������ⲿ���Ÿ�������е��κζλ��������.��Ҳ���Ա� ���õ�ͨ�ñ�����,����6.2.8. 6.2.8 `obj'��`COMMON'����������չ. 'obj'��ʽ����ͨ�ñ���Ϊnear��far;NASM������ָ����ı���������һ��,�﷨�� ��: common nearvar 2:near ; `nearvar' is a near common common farvar 10:far ; and `farvar' is far Farͨ�ñ������ܻ����64Kb,����OMF���԰���������Ϊһ��������ָ���Ĵ�С��Ԫ ��.����,10byte��farͨ�ñ������Ա�����Ϊ10��1byte��Ԫ��,5��2byte��Ԫ��,�� 2��5byte��Ԫ��,��1��10byte��Ԫ��. ��Щ'OMF'��������ҪԪ�ص�size,ͬʱ��Ҫ������size,���ڶ��ģ��������ͨ�ñ� ��ʱ������������ƥ��.����NASM���������������farͨ�ñ�����ָ��Ԫ�ص�size. �����ͨ��������﷨ʵ��: common c_5by2 10:far 5 ; two five-byte elements common c_2by5 10:far 2 ; five two-byte elements ���Ԫ�ص�sizeû�б�ָ��,ȱʡֵ��1.����,���Ԫ��size��ָ����,��ô'far'�ؼ� �־Ͳ���Ҫ��,��Ϊֻ��farͨ�ñ�������Ԫ��size��.���������������ͬ��: common c_5by2 10:5 ; two five-byte elements common c_2by5 10:2 ; five two-byte elements ������չ�����Ի���,'obj'�е�'COMMON'��������������'EXTERN'����֧��ȱʡ�� 'WRT'ָ��,��Ҳ������������: common foo 10:wrt dgroup common bar 16:far 2:wrt data common baz 24:wrt data:6 6.3 `win32': ΢��Win32Ŀ���ļ� 'win32'�����ʽ����΢��win32Ŀ���ļ�,����������΢����������������,���� Visual C++.ע��Borland Win32��������ʹ�����ָ�ʽ,����ʹ��'obj'��ʽ(���� 6.2) 'win32'�ṩȱʡ������ļ���չ��'.obj'. ע��,����΢������Win32Ŀ���ļ���ѭ'COFF'��׼(ͨ��Ŀ���ļ���ʽ),����΢�� ��Win32������������Ŀ���ļ���һЩCOFF������(����DJGPP)��������,������Ҳ һ��.������һЩPC��ص������ϵIJ�����ɵ�. ʹ��NASM��'coff'�����ʽ,���� ��������DJGPPʹ�õ�COFF�ļ�; ������'coff'��ʽ���ܲ�������Win32��������ȷ ʹ�õĴ���. 6.3.1 `win32'��`SECTION'����չ. ����'obj'��ʽ,'win32'��������'SECTION'������������ָ�����ӵ���Ϣ,�������� ���������Ķε�����������.���ڱ�׼�Ķ���'.text','.data',��'.bss',���ͺ��� ������NASM�Զ�������,���ǻ��ǿ���ͨ��һЩ�޶���������ָ��: ���õ��޶�������: (*) 'code'����'text',��һ���ζ���Ϊһ�������,��������οɶ�����ִ��,���� ����д,ͬʱҲ����������,�ε������Ǵ����. (*) 'data'��'bss'����һ�����ݶ�,����'code',���ݶα���ʶΪ�ɶ���д,������ִ ��,'data'����һ������ʼ���������ݶ�,'bss'����һ��δ��ʼ�������ݶ�. (*) 'rdata'����һ����ʼ�������ݶ�,���ɶ�,������д.΢���ı�����������Ϊһ ����ų����ĵط�. (*) 'info'����һ����Ϣ��,�����ᱻ�������ŵ���ִ���ļ���ȥ,�����Դ���һЩ ��Ϣ��������.����,����һ������'.drectve'��Ϣ�λ�����������������ڵ� ���ݽ���Ϊ������ѡ��. (*) 'align='����һ������,������'obj'��ʽ��һ��,�����εĶ�������.������ ��ָ��64:Win32Ŀ���ļ���ʽû�и���Ķζ���ֵ.�����������û�б���ʽ ָ��,ȱʡ�����,���ڴ����,��16byte����,����ֻ�����ݶ�,��8byte����,�� �����ݶ�,��4byte����.����Ϣ��ȱʡ������1byte(��û�ж���),���Զ�����˵, ָ������ֵû��. �����û��ָ���������޶���,NASM��ȱʡ������: section .text code align=16 section .data data align=4 section .rdata rdata align=8 section .bss bss align=4 �κ���Ķ��������'.text'һ�����Դ�. 6.4 `coff': ͨ��Ŀ���ļ���ʽ. 'coff'������Ͳ���'COFF'Ŀ���ļ�,���Ա�DJGPP��������. 'coff'�ṩһ��ȱʡ������ļ���չ��'.o'. 'coff'��ʽ֧�ָ�'win32'ͬ���Ķ���'SECTION'����չ,����'align'��'info'�� ��������֧��. 6.5 `elf': ��ִ�п����Ӹ�ʽĿ���ļ�. 'elf'�����ʽ����'ELF32'(��ִ�п����Ӹ�ʽ)Ŀ���ļ�,���ָ�ʽ����Linux, Unix System V��,����Solaris x86, UnixWare��SCO Unix. 'elf'�ṩһ��ȱ ʡ������ļ���չ��'.o'. 6.5.1 `elf'��`SECTION'����������չ. ����'obj'��ʽһ��,'elf'��������'SECTION'����������ָ�����ӵ���Ϣ,�Կ��� �������Ķε�����������.���ڱ�׼�Ķ���'.text','.data','.bss',NASM����� ��ȱʡ������������.�����ǿ���ͨ��һЩ�޶���������ָ��. ���õ��޶�������: (*) 'alloc'����һ����,�ڳ�������ʱ,����α��뱻�����ڴ���,'noalloc'���� �෴,������Ϣ��,��ע�Ͷ�. (*) 'exec'�Ѷζ���Ϊ�ڳ������е�ʱ�������ִ��Ȩ��.'noexec'�����෴. (*) `write'�Ѷζ���Ϊ�ڳ�������ʱ�����д,'nowrite'�����෴. (*) `progbits'�Ѷζ���Ϊ��Ŀ���ļ��б�����ʵ�ʵ�����,��������ͨ�Ĵ���� �����ݶ�,'nobits'�����෴,����'bss'��. (*) `align='����һ������,�����εĶ�������. �����û��ָ���������޶�����Ϣ,NASMȱʡָ��������: section .text progbits alloc exec nowrite align=16 section .rodata progbits alloc noexec nowrite align=4 section .data progbits alloc noexec write align=4 section .bss nobits alloc noexec write align=4 section other progbits alloc noexec nowrite align=1 (�κβ��������оٷ�Χ�ڵĶ�,��ȱʡ״����,������Ϊ'other'�ο���). 6.5.2 ��ַ�޹ش���: `elf'�ض��ķ��ź� `WRT' 'ELF'�淶�����㹻������������д��ַ�޹�(PIC)�Ĵ���,�������ELF�dz� ����ع�����.�������,��Ҳ��ζ��NASM�����Ҫ��Ϊһ���ܹ�дPIC�Ļ� �����Ļ�,�����ܹ���ELFĿ���ļ��в���������ֵ��ض�λ��Ϣ, ��Ϊ'ELF'��֧�ֻ��ڶεĵ�ַ����,'WRT'�������������ij��淽ʽ������ ʹ��,����,NASM��'elf'�����ʽ��,����'WRT'�������ʹ��Ŀ��,����: PIC��ص��ض�λ����. 'elf'�����������ķ���,���ǿ��Ա�����'WRT'���������ұ�����ʵ��PIC �ض�λ����.������`..gotpc', `..gotoff', `..got', `..plt' and `..sym'. ���ǵĹ��ܼ�Ҫ��������: (*) ʹ��'wrt ..gotpc'��������global offset tableΪ��ַ�ķ��Ż�õ� ��ǰ�ε���ʼ��ַ��global offset table�ľ���.( `_GLOBAL_OFFSET_TABLE_'������GOT�ı�׼������).��������Ҫ�ڷ��� ���ǰ�����'$$'���õ�GOT����ʵ��ַ. (*) ��'wrt ..gotoff'���õ����ijһ�����е�һ����ַʵ���ϵõ���GOT�� ����ʼ��ַ����ָ���ĵ�ַ֮��ľ���,�������ֵ�ټ���GOT�ĵ�ַΪ�� ������Ҫ���Ǹ���ʵ��ַ. (*) ʹ��'wrt ..got'���õ�һ���ⲿ���Ż�ȫ�ַ��Ż����������ں������ ���ŵĵ�ַ��GOT�н���һ�����,������û������GOT����ʼ��ַ���� ����ڵ�һ������;��������Լ���GOT�ĵ�ַ,Ȼ��ӵõ��ĵ�ַ������, �ͻ�õ�������ŵ���ʵ��ַ. (*) ʹ��'wrt ..plt'������һ����������������������һ���������ӱ����, ������û����PLT��ڵĵ�ַ.�������������ʹ���������,������� PC��ص��ض�λ��Ϣ,����,ELF��������PLT��ڵķ��ض�λ���� (*) �� ��8.2���л���һ������ϸ�Ĺ������ʹ����Щ�ض�λ����д������Ľ��� 6.5.3 `elf'��`GLOBAL'����������չ. 'ELF'Ŀ���ļ����԰�������һ��ȫ�ַ��ŵĺܶ���Ϣ,��������һ����ַ:�� ���԰������ŵ�size,����������.�ⲻ������Ϊ�˵��Եķ���,������д���� ������ʱ��,��ȷʵ�Ƿdz����õ�.����,NASM֧��һЩ����'GLOBAL'������ ����չ,������ָ����Щ����. ����԰�һ��ȫ�ַ���ָ��Ϊһ��������һ�����ݶ���,����ͨ�������ֺ��� ����һ��ð�Ÿ���'function'��'data'ʵ�ֵ�.('object'������������'data') ����: global hashlookup:function, hashtable:data ��ȫ�ַ���'hashlookup'ָ��Ϊһ������,��'hashtable'ָ��Ϊһ�����ݶ���. ��Ҳ����ָ����������Ź��������ݵ�size,����һ����ֵ����ʽ(�����԰��� labels,����ǰ������)�������ͺ���,����: global hashtable:data (hashtable.end - hashtable) hashtable: db this,that,theother ; some data here .end: ����NASM�Զ�������ij���,Ȼ�����Ϣ�Ž�'ELF'�ķ��ű���. ����ȫ�ַ��ŵ����ͺ�size��д����������ʱ���DZ����,�����ⷽ��ĸ��� ��Ϣ,����8.2.4. 6.5.4 `elf'��`COMMON'����������չ. 'ELF'Ҳ������ָ��ͨ�ñ����Ķ�������.����ͨ����ͨ�ñ��������ֺ�size�� �������һ����ð�ŷָ���������ʵ�ֵ�,����,һ��doubleword�������� 4byte����ȽϺ�: common dwordarray 128:4 ���array�ܵ�size����Ϊ128bytes,��ȷ�������뵽4byte�߽�. 6.5.5 16λ�����ELF 'ELF32'����ṩ����8λ��16λֵ���ض�λ,��GNU��������'ld'������Ϊ һ����չ�ӽ�ȥ��.NASM���Բ���GNU���ݵ��ض�λ,����16λ���뱻'ld'�� 'ELF'��ʽ��������.���NASMʹ����ѡ��'-w+gnu-elf-extensions',���һ ���ض�λ�������Ļ�,����һ��������Ϣ. 6.6 `aout': Linux `a.out' Ŀ���ļ� 'aout'��ʽ����'a.out'Ŀ���ļ�,���ָ�ʽ�����ڵ�Linuxϵͳ��ʹ��(���ڵ� Linuxϵͳһ��ʹ��ELF��ʽ,����6.5),���ָ�ʽ��������'a.out'Ŀ���ļ��� ����ͬ,�ļ���ͷ�ĸ��ֽڵ�ħ����һ��;����,��Щ�汾��'a.out',����NetBSD ��,֧�ֵ�ַ�޹ش���,��һ��,Linux�IJ�֧��. 'a.out'�ṩ��ȱʡ�ļ���չ����'.o'. 'a.out'��һ�ַdz��򵥵�Ŀ���ļ���ʽ.����֧���κ�����IJ�����,û������ �ķ���,��ʹ��'SEG'��'WRT',���ڱ�׼�IJ�����Ҳû���κ���չ.��ֻ֧������ ��׼�Ķ���'.text','.data','.bss'. 6.7 `aoutb': NetBSD/FreeBSD/OpenBSD `a.out'Ŀ���ļ�. 'aoutb'��ʽ������BSD unix,NetBSD,FreeBSD,OpenBSDϵͳ��ʹ�õ�'a.out'Ŀ ���ļ�. ��Ϊһ�ּ򵥵�Ŀ���ļ�,���ָ�ʽ��'aout'���˿�ͷ���ֽڵ�ħ���� һ��,������ȫ��ͬ.����,'aoutb'��ʽ֧�ָ�elf��ʽһ���ĵ�ַ�޹ش���,���� �����ʹ������д'BSD'������. 'aoutb'�ṩ��ȱʡ�ļ���չ����'.o'. 'aoutb'��֧������IJ�����,û������ķ���,ֻ����������Ķ���'.text', '.data'��'.bss'.����,����elfһ��֧��'WRT'��ʹ��,����Ϊ���ṩ��ַ�޹ص� �����ض�λ����.�����ⲿ�ֵ������ĵ�,�����6.5.2 'aoutb'Ҳ֧�ָ�'elf'ͬ���Ķ���'GLOBAL'����չ:��ϸ��Ϣ�����6.5.3. 6.8 `as86': Minix/Linux `as86'Ŀ���ļ�. Minix/Linux 16λ�����'as86'�����Լ��ķDZ�׼Ŀ���ļ���ʽ. ��Ȼ������ ����'ld86'��������ͨ��'a.out'�dz����ƵĶ��������,��'as86'��'ld86'֮ ��ʹ�õ�Ŀ���ļ���ʽ������'a.out'. NASM֧�����ָ�ʽ,��Ϊ�������õ�,'as86'�ṩ��ȱʡ������ļ���չ����'.o' 'as86'��һ���dz��򵥵�Ŀ���ʽ(��NASM�û��ĽǶ�����).����֧���κ����� �IJ�����,����,��ʹ��'SEG'��'WRT',�����еı�׼������Ҳû���κ���չ.��ֻ ֧��������׼�Ķ���:'.text','.data',��'.bss'. 6.9 `rdf': ���ض�λ�Ķ�̬Ŀ���ļ���ʽ. 'rdf'�����ʽ����'RDOFF'Ŀ���ļ�.'RDOFF'(���ض�λ�Ķ�̬Ŀ���ļ���ʽ) `RDOFF'��NASM�Բ���Ŀ���ļ���ʽ,��NASM������Ƶ�,������ӳ�ڻ�������� ���ṹ��. 'RDOFF'������֪���IJ���ϵͳ�ж�û�еõ�Ӧ��.����,��Щ����д�����Լ��� ����ϵͳ���˿��ܷdz�ϣ��ʹ��'RDOFF'��Ϊ�����Լ���Ŀ���ļ���ʽ,��Ϊ 'RDOFF'����Ƶ÷dz���,�����к��ٵ������ļ�ͷ��Ϣ. NASM�ĺ���Դ�����Unix����DOS���ж�����һ��'rdoff'��Ŀ¼,������һ�� RDOFF����:һ��RDF������,һ��RDF��̬�������,һ��RDF�ļ�dump����,���� һ���������������Linux�������ִ��RDF����. 'rdf'ֻ֧�ֱ�׼�Ķ���'.text','.data','.bss'. 6.9.1 ��Ҫһ����: `LIBRARY'������. 'RDOFF'ӵ��һ�ֻ���,��һ��Ŀ���ļ�����һ��ָ���Ŀⱻ���ӽ�ģ����,���� ��������ʱ,Ҳ������������ʱ���ӽ���.����ͨ��'LIBRARY'��������ɵ�,���� ��һ������,������������: library mylib.rdl 6.9.2 ָ��һ��ģ������: `MODULE'������. �ض���'RDOFF'ͷ��¼�������洢ģ�������.�����Ա���������ʱ���������� ̬����.'MODULE'����������һ������,����ǰģ�������: module mymodname ע��,���㾲̬����һ��ģ��,������������������ļ��г�ȥ����ʱ,���е�ģ ������Ҳ�ᱻ��ȥ.Ϊ�˱����������,��Ӧ����ģ�������ǰ��һ��'$',����: module $kernel.core 6.9.3 `rdf'��`GLOBAL'����������չ. 'RDOFF'ȫ�ַ��ſ��԰�����̬��������Ҫ�Ķ�����Ϣ.����԰�һ��ȫ�ַ��� ��ʶΪ������,��͸�����������Ҫ������Ŀ���ִ���ļ��л���ļ��г�ȥ. ������'ELF'��һ��,��Ҳ����ָ��һ������������һ�����̻���һ�����ݶ���. �����ֵ�β������һ��ð�ź�'exporg',��Ϳ�����һ�����ű�����: global sys_open:export Ҫָ��һ������������һ������(����),��Ҫ�������ĺ��ϼ���'proc'��'function' global sys_open:export proc ���Ƶ�,Ҫָ��һ�����������ݶ���,��'data'��'object'�ӵ��������ĺ���: global kernel_ticks:export data 6.10 `dbg': ���Ը�ʽ. ��ȱʡ������,'dbg'�����ʽ���ᱻ������NASM��.������Ǵ�Դ���뿪ʼ������ �Լ���NASM��ִ�а汾,�������'outform.h'�ж���'OF_DBG'���ڱ����������� ���϶���,�����Ϳ��Եõ�'dbg'�����ʽ. 'dbg'��ʽ�����һ����ͨ��Ŀ���ļ�;�����һ���ı��ļ�,������һ�����ڵ��� ����ʽ������ģ���ת���������б�.����Ҫ�����ڰ�����Щϣ��д�Լ��������� ����û�,�������ǾͿ��Եõ�һ������������ĸ�������������е���ʽ������ ӡ��. ���ڼ򵥵��ļ�,���Լ򵥵�����������ʹ��: nasm -f dbg filename.asm ������һ������'filename.dgb'������ļ�.����,������һЩĿ���ļ��Ͽ��ܹ� ���ò����Ǻܺ�,��Ϊÿһ��Ŀ���ļ����������Լ��ĺ�(ͨ�����û�����ʽ�IJ��� ��),����Щ����'dbg'��ʽ�в�û�ж���.���,����NASM�����Ƿdz����õ�,����Ϊ �˶�ѡ����ԴĿ���ļ���һ��Ԥ����: nasm -e -f rdf -o rdfprog.i rdfprog.asm nasm -a -f dbg rdfprog.i ���Ȱ�'rdfprog.asm��Ԥ������'rdfprog.i',��RDF�ض��IJ���������ȷ��ת���� ԭʼ��ʽ.Ȼ��,��Ԥ��������Դ���򱻽���'dbg'��ʽȥ�������յ�������. ���ַ�ʽ����'obj'��ʽ���Dz�����ȷ������,��Ϊ'obj'��'SEGMENT'��'GROUP'�� �����ڰѶ�������������Ϊ���ŵ�ʱ����и�����;���Գ��򲻻ᱻ���.����� ȷʵ��Ҫtraceһ��obj��Դ�ļ�,������Լ��������(����ʹ��'EXTERN') 'dbg'�������еĶ����������,��������ȫ����¼���Լ�������ļ���. ������: ��д16λ���� (DOS, Windows 3/3.1) --------------------------------------------------- ���½�����һЩ�ڱ�д������'MS-DOS'��'Windows 3.x'�µ�16λ�����ʱ����Ҫ �õ���һЩ������֪ʶ.������������ӳ���������.exe��.com�ļ�,�����д .sys�豸��������,�Լ�16λ�Ļ�����Դ�����C��������Borland Pascal������ ֮��ı�̽ӿ�. 7.1 ����'.EXE'�ļ�. DOS�µ��κδ�ij��򶼱��뱻������'.EXE'�ļ�,��Ϊֻ��'.EXE'�ļ�ӵ��һ�� �ڲ��ṹ����ͻ��64K�Ķ�����.Windows����Ҳ��Ҫ��������'.EXE'�ļ�,��Ϊ Windows��֧��'.COM'��ʽ. һ���,����ͨ��ʹ��һ������'obj'��ʽ��'.OBJ'Ŀ���ļ�������'.EXE'�ļ� ��,�����������������ӵ�һ��.����,NASMҲ֧��ͨ��'bin'�����ʽֱ�Ӳ���һ ���򵥵�DOS '.EXE'�ļ�(ͨ��ʹ��'DB'��'DW'������exe�ļ�ͷ),���ṩ��һ�� �����������һ��.��лYann Guidon��������һ���ִ���. ��NASM��δ���汾��,���ܻ���ȫ֧��'.EXE'�ļ�. 7.1.1 ʹ��'obj'��ʽ������'.EXE'�ļ�. ����ѡ���������IJ���'.EXE'�ļ��ķ���:��'.OBJ'�ļ����ӵ�һ��. �����16λ�ij������԰���������һ�����׵�������,�����û��,��һ����ѵ� ����VAL��������,��`x2ftp.oulu.fi'�Ͽ�����'LZH'���ĸ�ʽ�õ�.Ҳ������ `ftp.simtel.net'�ϵõ�. ��һ����ѵ�LZH��(�����������û��Դ�����),���� FREELINK,������`www.pcorner.com'�ϵõ�. ��������'djlink',����DJ Delorieд ��,������`www.delorie.com'�ϵõ�. ���ĸ� 'ALINK', ����Anthony A.J. Williams д��,������`alink.sourceforge.net'�ϵõ�. ���Ѷ��'.OBJ'���ӽ�һ��'.EXE'�ļ��е�ʱ��,����Ҫ��֤���ǵ������ҽ���һ �����г�����ڵ�(ʹ��'obj'��ʽ������������'..start'����6.2.6).���û�� ģ�鶨����ڵ�,�������Ͳ�֪��������ļ����ļ�ͷ��Ϊ��ڵ���ʲôֵ,�� ���ж����ڱ�����,�������Ͳ�֪�����׸�����һ��. һ�����ڰ�NASMԴ�ļ�����'.OBJ'�ļ�,���������ӳ�һ��'.EXE'�ļ��������� �������.����ʾ�˶���ջ,��ʼ���μĴ���,������ڵ�Ļ�������.����ļ�Ҳ ��NASM��'test'��Ŀ¼�����ṩ,������'objexe.asm'. segment code ..start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,stacktop ����һ�γ�ʼ�����룬�Ȱ�DS�Ĵ������ó�ָ�����ݶΣ�Ȼ��ѡ�SS���͡�SP���Ĵ��� ���ó�ָ���ṩ��ջ��ע�⣬��������£���'mov ss,ax'����һ��ָ����ʽ�ذ� �жϹرյ��ˣ��������У������� 'SS'�͡�SP���Ĺ����оͲ������жϷ���������û �п�ִ�е�ջ���á� ���У�һ������ķ���'..start'����δ���Ŀ�ͷ�����壬����ʾ���տ�ִ�д� �����ڵ㡣 mov dx,hello mov ah,9 int 0x21 ��������������'DS:DX'������һ��ָ��ӭ��Ϣ��ָ��('hello'��ʽ�ĸ��� ��data'���������data'�����ô������Ѿ������뵽��DS���Ĵ����У���������ָ���� ��Ч��)��Ȼ�����DOS�Ĵ�ӡ�ַ������ܵ��á� mov ax,0x4c00 int 0x21 ������ʹ����һ��DOS���ܵ��ý������� segment data hello: db 'hello, world', 13, 10, '$' ���ݶ��к���������Ҫ��ʾ���ַ����� segment stack stack resb 64 stacktop: ����Ĵ�������һ������64bytes��δ��ʼ��ջ�ռ�Ķ�ջ�Σ�Ȼ���ָ�� ��stacktop'ָ�����Ķ��ˡ�������'segment stack stack'������һ������ ��stack'�ĶΣ�ͬʱ��������Ҳ��'STACK'.���߲���һ����Ҫ���������Ӵ��� �ܻ���Ϊ��ij�����û�жε�����Ϊ'STACK'���������档 ������ļ��ڱ�����Ϊ'.OBJ'�ļ��У����Զ����ӳ�Ϊһ����Ч��'.EXE'�� ������������ʱ���ӡ��'hello world'��Ȼ���˳��� 7.1.2 ʹ�á�bin'��ʽ������`.EXE'�ļ��� '.EXE'�ļ����൱�򵥵ģ����Կ���ͨ����дһ�����������ļ�Ȼ����ǰ�� ������һ��32bytes��ͷ�Ϳ��Բ���һ��'.exe'���ļ��ˡ�����ļ�ͷҲ�� �൱�򵥣�������ͨ��ʹ��NASM�Լ���'DB'��'DW'���������������������ʹ ��'bin'�����ʽֱ�Ӳ���'.EXE'�ļ��� ��NASM�İ��У���һ��'misc'��Ŀ¼������һ�����ļ�'exebin.mac'�������� ��������`EXE_begin',`EXE_stack'��`EXE_end'. Ҫͨ�����ַ�������һ��'.EXE'�ļ�����Ӧ����ʼ��ʱ����ʹ��'%include'�� ��'exebin.mac'��������Դ�ļ��С�Ȼ����Ӧ��ʹ��'EXE_begin'��(���� �κβ���)�������ļ�ͷ���ݡ�Ȼ����ƽ��һ��д�����Ƹ�ʽ�Ĵ���-����� ʹ�����ֱ�׼�Ķ�'.text','.data','.bss'.���ļ��������Ӧ������ 'EXE_end'��(���Dz����κβ���)����������һЩ��ʶ��size�ķ��ţ�����Щ�� ����'EXE_begin'�������ļ�ͷ�������á� �����ģ���У������Ĵ�����д��'0x100'��ʼ�ĵ�ַ���ģ�������'.COM'�� ��-ʵ���ϣ�������ȥ�Ǹ�32bytes���ļ�ͷ����ͻ�õ�һ����Ч��'.COM'�� �����еĶλ�ַ����ͬ�ģ����Գ���Ĵ�С��������64K�ķ�Χ�ڣ��⻹�Ǹ� һ��'.COM'�ļ���ͬ��'ORG'�������DZ�'EXE_begin'��ʹ�õģ������㲻���Լ� ��ʽ��ʹ���� �����ֱ��ʹ����Ķλ�ַ�������ҵ��ǣ���Ϊ����Ҫ���ļ�ͷ����һ���ض� λ������ͻ��ø����ӡ�������Ӧ����'CS'�п�����һ���λ�ַ�� �������'.EXE'�ļ���'SS:SP'�Ѿ�����ȷ��ָ��һ��2Kb��ջ���������ͨ�� ����'EXE_stack'��������ȱʡ��2KB��ջ��С�����磬�����ջsize�ı䵽 64bytes,����Ե���'EXE_stack 64' һ�����������ַ�ʽ����һ��'.EXE'�ļ���������NASM������Ŀ¼'test'��, ������'binexe.asm' 7.2 ����`.COM'�ļ� һ�����DOS���������д��'.EXE'�ļ�����һ��С�ij����������д��'.COM' �ļ���'.COM'�ļ��Ǵ������Ƶģ�����ʹ��'bin'�����ʽ���Ժ����׵ĵز����� 7.2.1 ʹ��`bin'��ʽ����`.COM���ļ��� '.COM'�ļ�Ԥ�ڱ�װ�ص��������ڶε�'100h'ƫ�ƴ�(���ܶο��ܻ��)��Ȼ�� ��100h����ʼִ�У�����Ҫдһ��'.COM'������Ӧ������������д���룺 org 100h section .text start: ; put your code here section .data ; put data items here section .bss ; put uninitialised data here 'bin'��ʽ���'.text'�η����ļ����ʼ���������������Ҫ��������ڿ�ʼ ��д����ǰ������data��bssԪ�أ���������ջ��ǻ�ŵ��ļ����ʼ���� BSS(δ��ʼ����������)�α�����'.COM'�ļ��в���ռ�ݿռ䣺BSS�е�Ԫ�صĵ� ַ��һ��ָ���ļ������һ���ռ��һ��ָ�룬���������������ڳ��������У� �������Խ�ʡ�ռ䡣�����㲻Ӧ�����ŵ������г���ʱ�����BSS���Ѿ�����ʼ ��Ϊ���ˡ� Ϊ�˻������ij�����Ӧ������������ʹ�������У� nasm myprog.asm -fbin -o myprog.com ���û����ʽ��ָ������ļ��������'bin'��ʽ�����һ������'myprog'���� ����������������¸���ָ��һ���ļ����� 7.2.2 ʹ��`obj'��ʽ����`.COM'�ļ� �������дһ��'.COM'�ļ���ʱ�򣬲����˶���һ����ģ�飬�����ϣ������ ���'.OBJ'�ļ���Ȼ����������ӳ�һ��'.COM'���������ӵ��һ���ܹ���� '.COM'�ļ����������������������һ�㡣����ӵ��һ��ת������(���磬 'EXE2BIN')��һ��'.EXE'����ļ�ת��Ϊһ��'.COM'�ļ�Ҳ�ɡ� �����Ҫ�������������ע�⼸�����飺 (*) ��һ�����д����Ŀ���ļ������Ĵ�����У���һ������ǣ�'RESB 100h'�� ����Ϊ�˱�֤�����ڴ���λ�ַ��ƫ��'100h'����ʼ����������������ת�� �����ڲ���.com�ļ�ʱ���Ͳ��ص�����ַ�����ˡ������Ļ������ʹ��'ORG' ���������ﵽ��Ŀ�ĵģ�����'ORG'��NASM�ж���'bin'��ʽ��˵��һ����ʽ�� �صIJ�����������ﲻͬ�ĺ��塣 (*) �㲻�ض���һ����ջ�Ρ� (*) ������жα������һ�����У�����ÿ����Ĵ������������һ������ƫ�� ʱ�����е�ƫ��ֵ���������ͬһ���λ�ַ�ġ�������Ϊ����һ��'.COM'�ļ� ����ʱ�����еĶμĴ�������ͬһ��ֵ�� 7.3 ����`.SYS'�ļ� MS-DOS�豸����-'SYS'�ļ�-��һЩ���������ļ�����.com�ļ����ƣ�����һ�㣬 ���ǵ���ʼ��ַ��0��������'100h'����ˣ��������'bin'��ʽдһ���豸���� ���㲻��ʹ��'ORG'����������Ϊ'bin'��ȱʡ��ʼ��ַ�����㡣���Ƶģ������ ʹ��'obj'���㲻���ڴ���ε���ʼ��ʹ��'RESB 100h' '.SYS'�ļ�ӵ��һ���ļ�ͷ������һЩָ�룬��Щָ��ָ���豸�����ʵ�ʹ� ���IJ�ͬ���ӹ��̡�����ṹ�����ڴ���ε���ʼ�������壬������������ ʵ�ʵĴ��롣 Ҫ�õ�����'.SYS'�ļ��ĸ�����Ϣ��ͷ�ṹ�б�����������ݣ���һ����FAQ�� ������ʽ�������������`comp.os.msdos.programmer'�õ��� 7.4 ��16λC����֮��Ľӿڡ� ���½��ܱ�д����C����Ļ����̻�C������õĻ����̵Ļ���������Ҫ ������һ�㣬�����ѻ��ģ��д��'.OBJ'�ļ���Ȼ����������Cģ��һ�����ӣ� ����һ��������Գ��� 7.4.1 �ⲿ�������� C�����������е�ȫ�ַ���(����������)��������һ��ת�������DZ�����Ϊ���� ��ǰ�����һ���»��ߣ�������C�����г��ֵ����������ԣ����磬һ��C����� ����'printf'�Ի�����Գ�������˵��Ӧ����'_printf'������ζ������Ļ� ������У�����Զ���ǰ�治���»��ߵķ��ţ������ص��ĸ�C�еķ��������� ��ͻ�� ���������»��߲����㣬����Զ���һ�������滻'GLOBAL'��'EXTERN'���� ���� %macro cglobal 1 global _%1 %define %1 _%1 %endmacro %macro cextern 1 extern _%1 %define %1 _%1 %endmacro (��Щ��ʽ�ĺ�һ��ֻ����һ��������'%rep'�ṹ���Խ���������)�� �������������������һ���ⲿ���ţ� cextern printf �����ͻᱻչ���ɣ� extern _printf %define printf _printf Ȼ������ð�'printf'��Ϊһ�����������ã�Ԥ���������ڱ�Ҫ��ʱ�� ��ǰ�����һ���»��ߡ� 'cglobal'�������Ƶķ�ʽ������ 7.4.2 �ڴ�ģʽ�� NASMû���ṩ֧�ָ���C���ڴ�ģʽ��ֱ�ӻ��ƣ�������Լ���ס���ں� ��ģʽ�¹���������ζ�����Լ���������������飺 (*) ��ʹ�õ�������ε�ģʽ��(tiny small��compact)��������near�ģ� ���ʾ����ָ������Ϊһ�����������������ݶλ�ѹջʱ����16λ ����ֻ����һ��ƫ����(CS�Ĵ����е�ֵ�������ı䣬���Ǹ������� ��ַ�Ķε���������),�������þ�ʹ����ͨ��near'CALL'ָ����� ʹ��'RETN'(��NASM�У�����'RET'ͬ��)������ζ�����ڱ�д���Լ��� ����ʱ��Ӧ��ʹ��'RETN'���أ�������ⲿC����ʱ������ʹ��near�� 'CALL'ָ� (*) ��ʹ�ö���һ������ε�ģ����(medium, large��huge)������far�ģ� ���ʾ����ָ����32λ����(���� 16λ��ƫ��ֵ�ͽ����ŵ�16λ�� ��ַ)�����ֺ���ʹ��'CALL FAR'���е���(����'CALL seg:offset') ������ʹ��'RETF'��ͬ���ģ����д�Լ��Ĺ���ʱ��Ӧ��ʹ��'RETF', �����ⲿC����Ӧ��ʹ��'CALL FAR'�� (*) ��ʹ�õ������ݶε�ģ����(tiny, small��medium)������ָ����16λ ���ģ�ֻ����һ��ƫ����(��DS���Ĵ�����ֵ���ı䣬���Ǹ�������Ԫ�� �ĵ�ַ�Ķε�ַ����)�� (*) ��ʹ�ö���һ�����ݶε�ģ����(compact, large��huge)������ָ�� ��32λ���ģ�����һ��16λ��ƫ�Ƹ���һ��16λ�Ķε�ַ���㻹��Ӧ ��С�ģ���Ҫ���ı���ds��ֵ��û�лָ���������ES���Ա������ ����ȡ32λ����ָ������ݡ� 7.4.3 ��������ͺ������á� 16λ�����е�C����ת��������ʾ��������������У�_caller_��_callee_ �ֱ��ʾ�����ߺͱ������ߡ� (*) caller�Ѻ����IJ������෴��˳��ѹջ��(���ҵ������Ե�һ������ �����һ��ѹջ)�� (*) callerȻ��ִ��һ��'CALL'ָ��ѿ���Ȩ����callee��������ʹ�õ� �ڴ�ģʽ��'CALL'������near��far�� (*) callee���տ���Ȩ��Ȼ��һ���(������û�д������ĺ����У��ⲻ�� �����)�ڿ�ʼ��ʱ��ѡ�SP����ֵ������BP����Ȼ��Ϳ��԰ѡ�BP�� ��Ϊһ����׼ָ������Ѱ��ջ�еIJ�������Ȼ���������Ҳ�п����� caller���������ԣ�����'BP'�IJ��ֵ���ת������������C��������� �����callee���Ҫ��'BP'��Ϊ���ָ�룬���������ǰ��BPֵѹջ�� (*) Ȼ��callee���ܻ���'BP'��صķ�ʽȥ��ȡ���IJ�������[BP]�д���BP ��ѹջǰ���Ǹ�ֵ����һ��word,��[BP+2]�����Ƿ��ص�ַ��ƫ���� ��'CALL'ָ����ʽѹ�롣��һ��smallģʽ�ĺ����С���[BP+4]���Dz� ����ʼ�ĵط�����largeģʽ�ĺ����У����ص�ַ�Ķλ�ַ���ִ��� [BP+4]�ĵط����������Ǵ�[BP+6]����ʼ�ġ�����ߵIJ����DZ���һ���� ѹ��ջ��,������'BP'�����ƫ��ֵ�ϾͿ��Ա�ȡ��;���������������,ƫ �Ƶ�ַ��������.����,��һ����'printf'�����Ĵ���һ�������IJ����ĺ� ����,���෴��˳��Ѳ���ѹջ��ζ�ź�������֪�����Ķ�������ĵ�һ�� ����,����������Ը��߽ӽ��������ж��ٲ���,�����ǵ����ͷֱ���ʲô. (*) callee����ϣ����С'sp'��ֵ,�Ա���ջ�з��䱾�ر���,��Щ���������� 'BP'��ƫ�������д�ȡ. (*) callee�����Ҫ���ظ�callerһ��ֵ,Ӧ�ø������ֵ�Ĵ�С����'AL','AX' ��'DX:AX'��.����Ǹ������ͷ���ֵ,��ʱ(������������)�����'ST0'��. (*) һ��callee�����˴���,�����������˱��ؿռ�,�ʹ�'BP'�лָ�'SP'�� ֵ,Ȼ���ԭ����'BP'ֵ��ջ,Ȼ������ʹ�õ��ڴ�ģʽʹ��'RETN'��'RETF' ����ֵ. (*) ���caller��callee��������ȡ���˿���Ȩ,�����IJ����Ծ���ջ��,������ ��Ҫ��һ������������'SP'��ȥ,���Ƴ���Щ����(����ִ��һϵ�е�popָ�� ���ﵽ���Ŀ��).����,���һ��������Ϊƥ�������ż�����Դ���IJ����� ��������,ջ���ǻ᷵��һ��������״̬,��Ϊcaller֪���ж��ٸ�������ѹ ��,�����������ȷ���Ƴ�. ���ֵ���ת����Pascal����ĵ���ת����û�а취�Ƚϵ�(��7.5.1����).pascal ӵ��һ�����򵥵�ת������,��Ϊû�к���ӵ�пɱ���Ŀ�IJ���.����callee֪�� �����˶��ٲ���,��Ҳ���������Լ���ͨ������һ����������'RET'��'RETF'ָ�� ���Ƴ�ջ�еIJ���,����caller�Ͳ��������������.ͬ��,����Ҳ���Դ����� ��˳��ѹջ��,�����Ǵ��ҵ���,����ζ��һ�����������Ը�����ش����� �������������Ҫ��C�����һ��������Ӧ��������ķ�ʽ���У���������� ��smallģʽ�µġ� global _myfunc _myfunc: push bp mov bp,sp sub sp,0x40 ; 64 bytes of local stack space mov bx,[bp+4] ; first parameter to function ; some more code mov sp,bp ; undo "sub sp,0x40" above pop bp ret �ھ�ģʽ�£���Ӧ�ð�'RET'�滻��'RETF'��Ȼ��Ӧ����[BP+6]��λ�ô�Ѱ�ҵ� һ��������������[BP+4].��Ȼ�����ijһ��������һ��ָ��Ļ����Dz������� ��ƫ��ֵ����Ϊ�ڴ�ģʽ�ĸı���ı䣺farָ����Ϊһ������ʱ��ջ��ռ�� 4bytes����nearָ��ֻռ�������ֽڡ� ��һ���棬�������Ļ������е���һ��C��������Ӧ���������һЩ���飺 extern _printf ; and then, further down... push word [myint] ; one of my integer variables push word mystring ; pointer into my data segment call _printf add sp,byte 4 ; `byte' saves space ; then those data items... segment _DATA myint dw 1234 mystring db 'This number -> %d <- should be 1234',10,0 ��δ�����small�ڴ�ģʽ�µ�ͬ�������C���룺 int myint = 1234; printf("This number -> %d <- should be 1234\n", myint); ��largeģʽ�£��������ô�����ܸ�����������������������У�����DS�Ѿ� ���ж�'_DATA'�Ķλ�ַ�������ȱ����ʼ������ push word [myint] push word seg mystring ; Now push the segment, and... push word mystring ; ... offset of "mystring" call far _printf add sp,byte 6 �������ֵ��ջ�л���ռ��һ���ֵĿռ䣬��Ϊlargeģʽ������Ӱ�쵽'int' �������͵�size.printf�ĵ�һ������(���һ��ѹջ)����һ������ָ�룬���� ����һ���λ�ַ��һ��ƫ�������ڴ��У��λ�ַӦ�÷���ƫ������棬���ԣ� �������ȱ�ѹջ��(��Ȼ��'PUSH DS'��һ��ȡ��'PUSH WORD SEG mystring'�ĸ� �̵���ʽ�����DS�Ѿ�����ȷ���õĻ�)��Ȼ��ʵ�ʵĵ��ñ����һ��far���ã� ��Ϊ��largeģʽ�£��������DZ�far���õģ����ú�'SP'���뱻����6,������ 4�����ͷ�ѹ��ջ�еIJ����� 7.4.4 ��ȡ����Ԫ�ء� Ҫ����һ��C���������ݣ���������һ��C���Կ��Դ�ȡ�ı�������ֻ��Ҫ�ѱ� ��������Ϊ'GLOBAL'��'EXTERN'���ɡ�(�ٴ����ѣ�������7.4.1�������ܵģ��� ����ǰ��Ҫ����һ���»���)������һ����C�������ı���'ini i'�����ڻ���� ����������ʽ��ȡ�� extern _i mov ax,[_i] ��Ҫ����һ�����Լ��Ŀ��Ա�C�����ȡ�����ͱ����磺'extern int j'����� ��������(ȷ��������'_DATA'����)�� global _j _j dw 0 Ҫ��ȡC�����飬����Ҫ֪������Ԫ�ص�size.���磬'int'������2byte�������� ���һ��C����������һ������'int a[10]',�����������ȡ'a[3]':'mov ax, [_a+6]'.(�ֽ�ƫ��6��ͨ�������±�3��������Ԫ�ص�size2�õ��ġ�) ����C�� 16λ������������size���£�1 for `char', 2 for `short' and `int', 4 for `long' and `float', and 8 for `double'. Ϊ�˴�ȡC�����ݽṹ�������֪���ӽṹ�Ļ���ַ����������Ȥ�����ƫ�Ƶ� ַ�������ͨ����C�ṹ����ת��ΪNASM�Ľṹ����(ʹ��'STRUC'),���߼����� ��ƫ�Ƶ�ַȻ�������Ӧ������ �������κ�һ�ַ���ʵ�֣��������Ķ����C���������ֲ�ȥ�ҳ���������� ֯���ݽṹ�ġ�NASM�����ĺ�'STRUC'�в������κζԽṹ���Ա�Ķ�������� ��������ܻᷢ�ֽṹ��������������ӣ� struct { char c; int i; } foo; ���ܾ���4�ֽڳ��������������֣���Ϊ'int'��ᱻ���뵽2byte�߽硣���ǣ��� ���Ų���������C�������кܿ���ֻ��һ������ѡ�ʹ��������ѡ����� '#pragma'�С�����������ҳ���ı����������ʵ������ġ� 7.4.5 `c16.mac': ��16λC�ӿڵİ����ꡣ ��NASM���У���'misc'��Ŀ¼�£���һ�����ļ�'c16.mac'���������������� 'proc','arg'��'endproc'����Щ������C���Ĺ��̶����У������Զ������ �ܶ๤���������Ե���ת���ĸ��١� (����һ��ѡ���ǣ�TASM����ģʽ��'arg'����Ҳ���������NASM��Ԥ�������� ���4.9) �����ڻ�ຯ����ʹ��������һ���������£� proc _nearproc %$i arg %$j arg mov ax,[bp + %$i] mov bx,[bp + %$j] add ax,[bx] endproc ���'_nearproc'����Ϊһ����������������һ�����̣���һ��('i')��һ���� �������ڶ���('j')��һ��ָ����������ָ�룬������'i+*j'�� ע�⣬'arg'��չ���ĵ�һ����һ��'EQU'��������Ϊ�ں���õ�ǰ����Ǹ� label�ں�չ���󱻼����˵�һ�е�ǰ�棬����'EQU'�ܷ���ȡ����'%$i'�Ƿ� ��һ������'BP'��ƫ��ֵ��ͬʱһ��������������˵�DZ��ص�context-local�� ����ʹ�ã�����'proc'��ѹջ��Ȼ��'endproc'���ջ�����ԣ��ں����Ĺ��� �У�ͬ���IJ��������ǿ���ʹ�ã���Ȼ���㲻һ��Ҫ��ô���� ����ȱʡ״���°ѹ��̴�������Ϊnear����(tiny,small��compactģʽ����)�� �����ͨ������'%define FARCODE'����far����(medium, large��hugeģʽ�� ��)�����ı�'endproc'�����ķ���ָ������ͣ�����ı������ʼλ�õ�ƫ�� ֵ�����������������ʱ�������ϲ���������ָ����near��far�� 'arg'���Դ���һ����ѡ����������������size�����û��size������ȱʡ����Ϊ 2����Ϊ�������������������'int'���͡� ���溯����largeģʽ����ȥӦ����������ӣ� %define FARCODE proc _farproc %$i arg %$j arg 4 mov ax,[bp + %$i] mov bx,[bp + %$j] mov es,[bp + %$j + 2] add ax,[bx] endproc ��������'arg'��IJ������������sizeΪ4,��Ϊ'j'������һ��farָ�롣������ ��'j'����������ʱ�����DZ���ͬʱ����һ���λ�ַ��һ��ƫ��ֵ�� �ڰ���: ��д32λ����(Unix, Win32, DJGPP) --------------------------------------------------- ������Ҫ�����ڱ�д������Win32��Unix�µ�32λ���룬����Unix���ı������� ����DJGPP���ӵĴ���ʱ��ͨ����������һЩ���⡣���������α�д��32λC �������ӵĻ����룬���Ϊ�������д��ַ�޹صĴ��롣 �������е�32λ���룬����ʵ��ʹ���е�����������'Win32','DJGPP'������PC Unix���嶼���� ��_flat_�ڴ�ģʽ�¡�����ζ�ŶμĴ�����ҳ�Ѿ�����ȷ���ã� �Ը���һ��ͳһ��32λ��4Gb�ĵ�ַ�ռ䣬�������㵱ǰ�������ĸ����£����� ��Ӧ����ȫ�������еĶμĴ�������дһ��ƽ̹(flat)ģʽ�ij������ʱ����� ������ʹ�ö����ػ�ı�μĴ����������㴫��'CALL',��'JMP'�Ĵ���ε�ַ�� ���ȡ��ı���ʱʹ�õ����ݶε�ַ�����ȡ�ֲ������ͺ�������ʱ�Ķ�ջ�ε� ַʵ���϶���ͬһ����ַ�ռ��С�ÿһ����ַ����32λ����ֻ����һ��ƫ���� 8.1 ��32λC����֮��Ľӿڡ� ��7.4���кܶ������16λC����֮��ӿڵ����ۣ���Щ�����кܶ���32λ������ �����á����Ѿ����ص����ڴ�ģʽ�Ͷε������ˣ����������˺ܶࡣ 8.1.1 �ⲿ�������� �����32λ��C����������16λ��������ת�����ƣ������Ƕ�������е�ȫ�ַ� ��(����������)��������C�����г���ʱ��һ���»��߼���������ɡ����ǣ��� ���������е����еĶ�����������'ELF'��׼ָ��C�����ڻ�������в�����һ�� ǰ�����»��ߡ� �ϵ�Linux'a.out'C�����������е�'Win32'����������DJGPP'��'NetBSD' 'FreeBSD'��ʹ��ǰ�����»��ߣ�������Щ������������7.4.1�и����ĺ� 'cextern'��'cglobal'������������������'ELF'�������»�����û�б�Ҫ�ġ� 8.1.2 ��������ͺ������á� 32λ�����е�C����ת������������������������У�_caller_��_callee_����o ��ʾ���ú����ͱ����ú����� (*) caller�Ѻ����IJ������෴��˳��(���ҵ��������Ļ�����һ���������� ��һ��ѹջ)����ѹջ (*) Ȼ��,callerִ��һ��near'CALL'ָ��ѿ���Ȩ����callee�� (*) callee���ܿ���Ȩ��Ȼ��һ���(����ʵ���ϲ��DZ���ģ������������Ҫ ��ȡ���IJ����Ͳ���)��ʼ�ȴ洢'ESP'��ֵ��'EBP'�У������Ϳ���ʹ�� 'EBP'��Ϊһ����ָ��ȥջ��Ѱ�Ҳ��������ǣ���һ��Ҳ���Է���caller�� �������ԣ�����ת����'EBP'���뱻C����������������ΪcalleeҪ��'EBP' ����Ϊһ�����ָ����ʹ�ã����������ǰ��ֵ������������ (*) Ȼ��callee�Ϳ���ͨ����'EBP'��صķ�ʽ����ȡ���IJ����ˡ���[EBP] ����˫��ӵ�иոձ�ѹջ��'EBP'��ǰһ��ֵ����������˫�֣���[EBP+4] TH ,�DZ�'CALL'ָ����ʽѹ��ķ��ص�ַ��������Dz�����ʼ�ĵط����� [EBP+8]������Ϊ����ߵIJ������һ����ѹջ����[EBP]�����ƫ�Ƶ�ַ �ϾͿ��Ա�ȡ�ã�ʣ�µIJ������δ��ں��棬������������ƫ��ֵ��š� ��������һ����'printf'�Ĵ���һ�����������ĺ����У����෴��˳��� ����ѹջ��ζ�ź�������֪�����Ķ�ȥ�����ĵ�һ������������������� �������ܹ��ж��ٲ��������ǵ�������ʲô�� (*) callee����Ҳϣ���ܹ��ٴμ�С'ESP'��ֵ����Ϊ���ر������ٱ��ؿռ䣬 ��Щ����Ȼ��Ϳ���ͨ��'EBP'�ĸ�ƫ������ȡ�� (*) callee�����Ҫ���ظ�callerһ��ֵ����Ҫ�������ֵ��size�������� 'AL','AX'��'EAX'�С���������'ST0'�з��ء� (*) һ��callee����˴��������������ľֲ�ջ���������ʹ�'EBP'�лָ� 'ESP'��Ȼ�󵯳�ǰһ��'EBP'��ֵ����ͨ��'RET'���ء� (*) ��caller��callee����ȡ���˿���Ȩ�������IJ������Ƿ���ջ�У����ԣ��� ͨ����'ESP'����һ�������������Ƴ�����(������ִ��һϵ�е�'pop'ָ�� )�����������һ�����������Ϊ���⣬ʹ���˴���IJ���������ջ���� �᷵�ص�����״̬����Ϊcaller֪�����ٲ�����ѹջ�ˣ���������ȷ���� ���� ����Win32����ʹ�õ�Windows API���ã�����һ����ѡ�ĵ���ת����������Щ ��Windows API���õĺ���(��Ϊwindows����)Ҳһ����������ѭһ����΢���� ��'__stdcall'��ת�������Pascal��ת���ȽϽӽ��������calleeͨ���� 'RET'ָ���һ�����������ջ�����ǣ����������Դ��ҵ����˳��ѹջ�� �������������������������һ��C���ĺ����� global _myfunc _myfunc: push ebp mov ebp,esp sub esp,0x40 ; 64 bytes of local stack space mov ebx,[ebp+8] ; first parameter to function ; some more code leave ; mov esp,ebp / pop ebp ret ��һ���棬�����Ҫ����Ļ������е���һ��C���������������������д�� �룺 extern _printf ; and then, further down... push dword [myint] ; one of my integer variables push dword mystring ; pointer into my data segment call _printf add esp,byte 8 ; `byte' saves space ; then those data items... segment _DATA myint dd 1234 mystring db 'This number -> %d <- should be 1234',10,0 ��δ����ͬ�������C���룺 int myint = 1234; printf("This number -> %d <- should be 1234\n", myint); 8.1.3 ��ȡ����Ԫ�ء� Ҫ���ȡһ��C���������ݣ���������һ��C���Ի�ȡ�ı���������������� ������Ϊ'GLOBAL'��'EXTERN'(�ٴ����ѣ�������ǰ��Ҫ����һ���»��ߣ����� 8.1.1����������)��������һ��������Ϊ'int i'��C�������Դӻ������������ ��ȡ�� extern _i mov eax,[_i] ��Ҫ����һ��C������Ի�ȡ�����Լ��ı���'extern int j',�����������(ȷ ��������'_DATA'��) global _j _j dd 0 Ҫ��ȡC���飬�����֪�������Ԫ�ص�size�����磬'int'������4bytes������ �ԣ����һ��C����������һ������'int a[10]',�����ʹ�ô���'mov ax, [_a+12]����ȡ����'a[3]'��(�ֽ�ƫ��12��ͨ�������±�3��������Ԫ�ص�size 4�õ���)������C��32λ�������ϵ����ݵ�size���£�1 for `char', 2 for `short', 4 for `int', `long' and `float', and 8for `double'. Pointers, 32λ�ĵ�ַҲ��4�ֽڳ��� Ҫ��ȡC�����ݽṹ�壬�����֪���ӽṹ��Ļ���ַ��������Ҫ����֮���ƫ ��ֵ������԰�C�Ľṹ�嶨��ת����NASM�Ľṹ�嶨��(ʹ��'STRUC'),���߼� ��õ����ƫ��ֵ��Ȼ��ʹ������ �������κ�һ�ַ�ʽʵ�֣��㶼��Ҫ�Ķ����C���������ֲ��ҳ����������֯ �ṹ�����ݵġ�NASM������'STRUC'����û�и����κ��ض��Ķ������������ ��C�����������ṹ�壬������Լ�ָ�������������ܷ�����������Ľṹ �壺 struct { char c; int i; } foo; ������8�ֽڳ���������5�ֽڣ���Ϊ'int'��ᱻ���뵽4bytes�߽硣���ǣ��� ���Ų�������ʱ����C��������һ������ѡ�����ʹ��������ѡ���'#progma' ����ʵ�֣�����������ҳ����Լ��ı�������������ġ� 8.1.4 `c32.mac': ��32λC�ӿڵİ����ꡣ ��NASM�İ��У���'misc'��Ŀ¼�У���һ�����ļ�'c32.mac'���������������꣺ 'proc','arg'��'endproc'�����DZ���������C���Ĺ��̣����ǻ��Զ������ܶ� ���룬�����ٵ���ת�����̡� ʹ����Щ���һ����ຯ�����������£� proc _proc32 %$i arg %$j arg mov eax,[ebp + %$i] mov ebx,[ebp + %$j] add eax,[ebx] endproc ���Ѻ���'_proc32'�����һ���������������Ĺ��̣���һ��('i')��һ���������� �ڶ���('j')��һ��ָ����������ָ�룬������'i+*j'�� ע�⣬��'arg'չ����ĵ�һ���и�'EQU'����Ϊ�ں�����е�ǰ����Ǹ�label ���ӵ��˵�һ���ϣ�'EQU'�оͿ������������ˣ�����'%Si'����Ϊһ����'BP' Ϊ��ַ��ƫ��ֵ��һ��context-local���������ﱻʹ�ã���'proc'��ѹջ��Ȼ ��'endproc'���ջ�����ԣ�ͬ���IJ������ں����Ĺ����л��ǿ���ʹ�ã���Ȼ �㲻һ��Ҫ�������� 'arg'����һ����ѡ�IJ���������������size�����û��size������ȱʡ����4���� Ϊ�ܶຯ������������'int'���ͻ�����һ��ָ�롣 8.2 ��дNetBSD/FreeBSD/OpenBSD��Linux/ELF������ 'ELF'��Linux��ȡ�����ϵ�'a.out'Ŀ���ļ���ʽ����Ϊ���������ڵ�ַ�޹ش��� (PIC)��֧�֣�������ñ�д�������ú����ס�NASM֧��'ELF'�ĵ�ַ�޹ش��� ���ԣ������������NASM����дLinux��'ELF'�����⡣ NetBSD,�����Ľ���FreeBSD,OpenBSD,������һ�ֲ�ͬ�ķ��������ǰ�PIC֧���� ����'a.out'��ʽ��NASM֧����Щ��ʽ�������ǽ���'aoutb'�����ʽ��������� ����NASM��дBSD�Ĺ����⡣ ����ϵͳ��ͨ����һ�����ļ��ڴ�ӳ�䵽һ�����н��̵ĵ�ַ�ռ��ϵ�ijһ���� ��ʵ������PIC������ġ����ԣ���Ĵ�������ݱ��벻�������������뵽���� ���ʲô�ط��� ��ˣ��㲻��ͨ������Ĵ���õ���ı����� mov eax,[myvar] ; WRONG ����ͨ���������ṩһƬ�ڴ�ռ䣬��Ƭ�ռ����ȫ��ƫ�Ʊ�(GOT)��GOT���ŵ� ���������һ����������ֵ�ĵط�����������㷢������Ŀⱻ���뵽��ʲô �ط�(�����ͨ��ʹ��'CALL'��'POP'ָ����õ�)������Եõ�GOT�еĵ�ַ��Ȼ ����Ϳ���ͨ�������������������GOT�е������������ı����ĵ�ַ�� ��PIC����������ݶξ�û����Щ�����ˣ���Ϊ���ݶ��ǿɶ��ֵģ������뱻�� �����ڴ��У������ǽ����ӿ��ļ�����һ��ӳ�䣬����һ������������������ �Ϳ��Ա��ض�λ����������԰�һЩ����������ݶ����ض�λ�������ý������� ���ص��Ļ���ʲô�������� 8.2.1 ȡ��GOT�еĵ�ַ�� ÿ������Ĺ������еĴ���ģ�鶼Ӧ����GOT����Ϊһ���������ţ� extern _GLOBAL_OFFSET_TABLE_ ; in ELF extern __GLOBAL_OFFSET_TABLE_ ; in BSD a.out ����Ĺ������У���Щ��Ҫ��ȡ���data��BSS�������ݵĺ���������������� �Ŀ�ͷ�ȼ���GOT�ĵ�ַ����һ����������ʽ��д��������� func: push ebp mov ebp,esp push ebx call .get_GOT .get_GOT: pop ebx add ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc ; the function body comes here mov ebx,[ebp-4] mov esp,ebp pop ebp ret (����BSD, ����`_GLOBAL_OFFSET_TABLE'��ͷ��Ҫ�����»��ߡ�) ���������ͷ����ֻ�Ǽ򵥵ı�׼��C���Ŀ�ͷ����������ջ��ܣ������� ���DZ�׼��C���Ľ�β�������У��͵��������У��ֱ𱣴�ͻָ�'EBS'�Ĵ��� ����ΪPIC������ʹ������Ĵ�������GOT�ĵ�ַ�� ��ؼ�����'CALL'ָ��ͽ����������д��롣'CALL'��'POP'һ��������� .get_GOT�ĵ�ַ�����ý�һ��֪���������뵽ʲô�ط�(��Ϊcallָ���ǽ��� �ɸ���ǰ��λ�����)����ADD��ָ��ʹ����һ�������PIC�ض�λ���ͣ�GOTPC �ض�λ��ͨ��ʹ���޶���'WRT ..gotpc',�����õķ���(������ `_GLOBAL_OFFSET_TABLE_',һ��������GOT���������)���ԴӶ���ʼ��ַ��ʼ ��ƫ�Ƶ���ʽ������(ʵ���ϣ���ELF����������Ϊ�ӡ�ADD���IJ�������ʼ�� һ��ƫ�ƣ���NASM�������ˣ��������ڡ�ELF���͡�BSD���п�����ͬ���ķ� ʽ������)���ԣ�����ָ��Ȼ����϶���ʼ��ַ��Ȼ��õ�GOT�������ĵ�ַ�� Ȼ���ȥ'.get_GOT'��ֵ��������ָ��ִ�н�����ʱ��'EBX'�к���'GOT' ��ֵ�� ����㲻������������ݣ�Ҳ���õ��ģ���Ϊû�б�Ҫ�Եڶ��ַ�ʽ����� GOT�ĵ�ַ�����ԣ�����԰�������ָ��д��һ���꣬Ȼ��Ϳ��԰�ȫ�غ��� ���ǣ� %macro get_GOT 0 call %%getgot %%getgot: pop ebx add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc %endmacro 8.2.2 Ѱַ��ı�������Ԫ�ء� �õ�GOT�������ʹ�������õ��������Ԫ�صĵ�ַ��������������������� ���Ķ��У����ǿ���ͨ��ʹ��'..gotoff'���õ����������ķ�ʽ���£� lea eax,[ebx+myvar wrt ..gotoff] ����ʽ'myvar wrt ..gotoff'�ڹ����ⱻ���ӽ�����ʱ�򱻼��㣬�õ���GOT ��ʼ��ַ��ʼ�ı���'myvar'��ƫ��ֵ�����ԣ������ӵ������'EBX'��,���� ���ŵ�'EAX'��. ������һЩ��������Ϊ'GLOBAL',��û��ָ�����ǵ�size�Ļ�,�����ڿ��е� ����ģ���ᱻ����,�����ᱻ�ӿ��е������������ǵij�����.���ǻ������ ����ij���data��BSS����,����ͨ�������'..gotoff'����,����԰�������Ϊ �ֲ�����������ȡ ע��,��ΪBSD��'a.out'��ʽ���������ض�λ���͵�һ�ַ�ʽ,����Ҫ��ȡ�ĵ� ַ����ͬһ�����ڱ���������һ���DZ��صķ���. 8.2.3 Ѱַ�ⲿ��ͨ������Ԫ��. �����Ŀ���Ҫ�õ�һ���ⲿ����(�Կ���˵���ⲿ��,�����Ƕ������ڵ�һ�� ģ��),�����ʹ��'..got'���͵õ���.'..got'����,���������GOT����ַ�� ������ƫ��,������Ǵ�GOT����ַ��һ���������������ַ��GOT��ڵ�ƫ��, ���������ڹ�����ʱ�������GOT���,��̬��������������ʱ�������ڷ��� ��ȷ�ĵ�ַ.����,Ҫ�õ�һ���ⲿ����'extvar'�ĵ�ַ,���ŵ�EAX��,����� ����д: mov eax,[ebx+extvar wrt ..got] �����GOT��һ�����������'extvar'�ĵ�ַ.�������ڹ����������ʱ��,���� ��ÿһ��'..got'���͵��ض�λ��Ϣ,Ȼ�󹹽�GOT,��֤������ÿһ��������� �� ͨ�ñ���Ҳ���������ַ�ʽ����ȡ. 8.2.4 �ѷ��ŵ��������û�. �������Ҫ�ѷ��ŵ��������û�,��������������Ϊ����������,����������� ��,������������Ԫ�ص�size.������Ϊ��̬����������Ϊÿһ�������ĺ��� �����������ӱ����,��Ҫ�ѵ�������Ԫ�شӿ�����ݶ����Ƴ�. ����,����һ�����������û�,���������: global func:function ; declare it as a function func: push ebp ; etc. ������һ������Ԫ��,��������,���������д����: global array:data array.end-array ; give the size too array: resd 128 .end: С��:�����ϣ��ͨ���ѱ�������Ϊ'GLOBAL'��ָ��һ��size,�����������û�, ����������ջ����������������ݶ���,����������Ŀ�����ݶ���,������ ����ͨ��ʹ��'..got'��������ȡ���Լ���ȫ�ֱ���,������'..gotogg',������ ��һ���ⲿ����һ��(ʵ����,���Ѿ�������ⲿ����). ͬ����,�������Ҫ��һ��������ȫ�ֱ����ĵ�ַ�������һ�����ݶ���,�㲻�� ͨ������ı�׼��ʽʵ��: dataptr: dd global_data_item ; WRONG NASM���Ը���ͨ���ض�λ������δ���,������,'global_data_item'������һ�� ��'.data'��(����������)��ʼ��һ��ƫ��ֵ;��������������ջ�ָ��������� ��,�����ǵ���ȫ�ֱ���. ��������Ĵ���,��Ӧ������д: dataptr: dd global_data_item wrt ..sym ��ʱʹ����һ�������'WRT'����'..sym'��ָʾNASM�����ű���ȥѰ��һ������ ����ַ���ض�����,������ͨ���λ�ַ�ض�λ. ����һ�ַ�ʽ����Ժ�����:������ķ����������һ������: funcptr: dd my_function ����û�һ����Ĵ���ĵ�ַ,��: funcptr: dd my_function wrt .sym ������������ӱ��еĸú����ĵ�ַ,���������ĵ��ó���Ӧ�õõ��ĵ�ַ.�� �ֵ�ַ���ǿ��е�. 8.2.5 �ӿ�����ù���. ����Ĺ������ⲿ���ù��̱���ͨ��ʹ�ù������ӱ�(PLT)����ʵ��,PLT������ �����봦��һ����֪��ƫ�Ƶ�ַ��,���Կ���������һ�ֵ�ַ�޹صķ�ʽȥ�� ��PLT.��PLT������ת������GOT�е�ƫ�Ƶ�ַ�Ĵ���,���ԶԹ������л������� �еĺ������ÿ��Ա�ת��Ϊֱ�Ӵ������ǵ���ʵ��ַ. Ҫ����һ���ⲿ����,�����ʹ����һ�������PIC�ض�λ����,'WRT ..plt'.�� ���Ȼ���GOT��Ҫ�򵥵ö�:��ֻ��Ҫ�ѵ���'CALL printf'�滻ΪPLT��صİ� ��:`CALL printf WRT ..plt'. 8.2.6 �������ļ�. д����һЩ����ģ�鲢�����ǻ���'.o'�ļ���,��Ϳ��Բ�����Ĺ�������, ʹ�����������Ϳ���: ld -shared -o library.so module1.o module2.o # for ELF ld -Bshareable -o library.so module1.o module2.o # for BSD ����ELF,�����Ĺ�����Ҫ����ϵͳĿ¼'/usr/lib'��'/lib'��,�Ƕ�������ʹ ��'-soname'���԰����յĿ��ļ����Ͱ汾�ŷŽ�����: ld -shared -soname library.so.1 -o library.so.1.2 *.o Ȼ����Ϳ��԰�'library.so.1.2'���������ļ�Ŀ¼��,Ȼ����һ�����ķ��� ����ױ'library.so.1'. �ھ���: ���16λ��32λ���� ------------------------------------ ���½�����һЩ���dz��õĵ�ַ����תָ����ص�һЩ����, ��Щ���⵱���� ��д����ϵͳ����ʱ�᳣����,���籣��ģʽ��ʼ������,����Ҫ���������� �Ķ�size,������16λ���еĴ�����Ҫȥ�޸���32λ���е�����,�����ڲ�ͬ�� size�Ķ�֮�����ת. 9.1 ���Size����ת. ��õĻ��sizeָ�����ʽ����д32λ����ϵͳʱ�õ���:��16λģʽ����� �������,���������ں�,Ȼ�������ͨ�����뵽����ģʽ��������,Ȼ����ת�� 32λ���ں���ʼ��ַ��.��һ����ȫ32λ�IJ���ϵͳ��,������Ψһ��Ҫ�õ���� sizeָ��ĵط�,��Ϊ����֮����������鶼�����ڴ�16λ���������,������֮ ����������鶼�ڴ�32λ������. ������ת����ָ��һ��48λ��Զ��ַ,��ΪĿ�����һ��32λ��.����,�������� 16λ���б����,����,����������д����: jmp 0x1234:0x56789ABC ; wrong! ������������,��Ϊ��ַ��ƫ���򲿷ֻᱻ�ضϳ�'0x9ABC',Ȼ��,��ת����һ�� ��ͨ��16λԶ��ת. Linux�ں˵����ô���ʹ��'as86'ͨ���ֹ���������������ָ��,ʹ��'DB'ָ��, NASM���Ա�������Щ,�����Լ�������ȷ��ָ��,��������ȷ������: jmp dword 0x1234:0x56789ABC ; right 'DWORD'ǰ׺(�ϸ�ؽ�,��Ӧ�÷���ð��ĺ���,��Ϊ��ֻ�ǰ�ƫ��������Ϊ doubleword;����NASM�����κ�һ����ʽ,��Ϊ����д��������ȷ��)ǿ��ƫ���� �ڼ���������һ��16����ת��32λ�ε�ǰ����,������Ϊfar. ��������һ���෴�IJ���,��һ��32λ������ת��һ��16λ��,ʹ��'word' ǰ׺: jmp word 0x8765:0x4321 ; 32 to 16 bit ���'WORD'ǰ׺��16λģʽ�±�ָ��,����'DWORD'ǰ׺��32λģʽ�±�ָ��, ���Ƕ��ᱻ����,��Ϊ����ÿһ������ʽǿ��NASM����һ���ѽ������ģʽ. 9.2 �ڲ�ͬsize�Ķμ�Ѱַ. �����IJ���ϵͳ��16λ��32λ��ϵ�,����������дһ��DOS����չ,����� ���봦��һЩ16λ�κ�һЩ32λ��.��ijЩ�ط�,���������Ҫ��һ��16λ���� ��д�ܻ�ȡ32λ���е����ݵĴ���,�����෴. �����Ҫ��ȡ��32λ���е����������ڶε�ǰ64K�ķ�Χ��,�����ͨ����ͨ�� 16λ��ַ�������ﵽĿ��;���ǻ�����,�����Ҫ��16λģʽ�д���32λ��Ѱ ַ. ����Ľ��������֤��ʹ����һ���Ĵ������ڱ����ַ,��Ϊ�κ���32λ�Ĵ��� �е���Ч��ַ����ǿ����Ϊһ��32λ�ĵ�ַ,����,�����: mov eax,offset_into_32_bit_segment_specified_by_fs mov dword [fs:eax],0x11223344 �������,����Щ��׾(��Ϊ���˷���һ��ָ���һ���Ĵ���),������Ѿ�֪�� ���Ŀ�����ڵľ�ȷƫ��.x86�ܹ�����32λ��Ч��ַ��ָ��Ϊһ��4bytes��ƫ ��,����,NASMΪʲô��ΪЩ����һ����ѵ�ָ����? ������,������9.1��һ��,��ֻ��Ҫ�ڵ�ַǰ����һ��'DWORD'ǰ׺,Ȼ��,���� ��ǿ����Ϊһ��32λ�ĵ�ַ: mov dword [fs:dword my_offset],0x11223344 ͬ����9.1��һ��,NASM��������'DWORD'ǰ׺���ڶ����ط�ǰ,�������,���� ���԰Ѵ���ĵúÿ�һЩ: mov dword [dword fs:my_offset],0x11223344 ��Ҫ��'DWROD'ǰ׺���ڷ���������,�����������ƴ洢����������ݵ�size��, ���ڷ������ڵĻ�,�����Ƶ�ַ�����ij���.�����ַ�ʽ���Ա������׵�����: mov word [dword 0x12345678],0x9ABC ���һ��16λ�����ݷŵ���һ��ָ��Ϊ32λƫ�Ƶĵ�ַ��. ��Ҳ���԰�'WORD'��'DWROD'ǰ׺��'FAR'ǰ׺�ŵ�һ��,�������ת�����,�� ��: call dword far [fs:word 0x4321] ����ָ�����һ��ָ��Ϊ16λƫ�Ƶĵ�ַ,��������һ��48λ��Զָ��,(16λ �κ�32λ��ƫ��),Ȼ����������ַ. 9.3 �����Ļ��sizeָ��. �������Ҫ���ڻ�ȡ���ݵ������ķ�ʽ���ܾ���ʹ���ַ���ָ��('LODSx' 'STOSx',�ȵ�)��'XLATB'ָ��.��Щָ����Ϊ�������κβ���,����ȥ������� �����DZ�����16λ�ε�ʱ��ʹ����ʹ��32λ��ַ. ��������NASM��'a16'��'a32'ǰ׺��Ŀ��,���������16λ���б�д'LODSB', �����DZ�������ȡһ��32λ���е��ַ�����,��Ӧ����Ŀ���ַ����'ESI',Ȼ ���д: a32 lodsb ���ǰ׺ǿ�Ƶ�ַ��sizeΪ32λ,��˼��'LODSB'��[DS:ESI]����������,������ ��[DS:SI]��.Ҫ�ڱ�д32λ�ε�ʱ��,��ȡ��16λ���е��ַ���,��Ӧ��ǰ׺'a16' ���Ա�ʹ��. 'a16'��'a32'ǰ׺���Ա����õ�NASMָ������κ�ָ����,���������еĴ���� ������û��������ǰ׺������²����������õ���ʽ.������ǰ׺ֻ������Щ�� ����ʽ��ַ��ָ��������Ч��: `CMPSx' (section B.4.27), `SCASx' (section B.4.286), `LODSx' (section B.4.141), `STOSx' (section B.4.303), `MOVSx' (section B.4.178), `INSx' (section B.4.121), `OUTSx' (section B.4.195), and `XLATB' (section B.4.334). ����,���DZ���ѹջ���ջָ��,(`PUSHA'��`POPF' �͸����õ�`PUSH'��`POP') ���Խ���'a16'��'a32'ǰ׺�ڶ�ջ��������һ����ͬsize�Ĵ�����е�ʱ��,ǿ ��һ���ض���'SP'��'ESP'������ջָ��, 'PUSH'��'POP',����32λģʽ�б����ڶμĴ�����ʱ,Ҳ����һ����ͬ����Ϊ, ���ǻ�һ�β���4bytes,����ߴ�������������,����ײ��������������������� �μĴ�����ֵ.Ϊ��ǿ��push��popָ���16λ��Ϊ,�����ʹ�ò�����ǰ׺'o16' o16 push ss o16 push ds ��δ�����ջ�ռ��п���һ��doubleword���ڴ�������μĴ���,����һ����� ��,��һ��doublewordֻ����һ���Ĵ�����ֵ. (��Ҳ����ʹ��'o32'ǰ׺��16λģʽ��ǿ��32λ��Ϊ,���⿴��ȥ��û��ʲô�� ��.) ��ʮ��: ���� --------------------------- ���½���һЩ�û���ʹ��NASMʱ�����������ձ�������,���������.ͬʱ,����� �����������δ�г���BUG,���Ҳ�����ύbug�ķ���. 10.1 �ձ��Ե�����. 10.1.1 NASM�����˵�Ч�Ĵ���. �ҵõ��˺ܶ����NASM�����˵�Ч�����BUG����,�����Dz����������,������ ָ��'ADD ESP,8'�����Ĵ���.��ʵ����һ��������˼�����������,����Ԥ��� ������:NASM����'ADD ESP,8'ʱ,�����һ��Ԥ��32λƫ�Ƶ�ָ����ʽ.����� ϣ������һ����Լ�ռ��ָ����ʽ,�����д��'ADD ESP,BYTE 8'.�ⲻ��һ��BUG, ����Ҳֻ������һ�����õ�����,���˿�����ͬ����. 10.1.2 �ҵ�jumpָ�����Χ. ���Ƶ�,���Ǿ�����Թ˵������ʹ��������תָ��ʱ(��Щָ��ȱʡ״������'short' ��)������Ҫ��ת�Ƚ�Զ,��NASM�ᱨ��˵'short jump out of range',�������� Զת. ͬ��,��Ҳ�ǿ�Ԥ��ִ�е�һ������,��ʵ���ϻ���һ������ʵ�ʵ�����.NASMû�� �취֪���������Ĵ������еĴ�����������;�������Լ����ܾ�����Ӧ�ò���' Jcc NEAR'���͵�ָ��,��Ϊ����֪��������386�����һ���Ĵ������Ϲ���.�෴, ���ѿ��ܳ�����Χ�Ķ�'JNE'ָ���滻��һ���̵ܶ�'JE'ָ��,���ָ��������� һ��'JMP NEAR'ָ��;���ڵ���386�Ĵ�����,����һ�����еĽ������,���Ƕ��� �нϺõķ�֧Ԥ�⹦�ܵĴ����������нϺõ�Ч��,���Կɴ�֮��'JNE NEAR'.�� ��,����ʲô��ָ���ȡ�����û�,�����ǻ��������. 10.1.3 `ORG'����������. ��Щ��'bin'��ʽд����������������Ǿ�����Թ'ORG'û�а�������ϣ�������� ��������:Ϊ�˰�'0xAA55'�ŵ�512�ֽڵ�����������ĩβ,ʹ��NASM�����ǻ����� д: ORG 0 ; some boot sector code ORG 510 DW 0xAA55 �ⲻ��NASM��ʹ��'ORG'����ȷ��ʽ,������������.�������������ȷ������ʹ�� 'TIMES'������,��������: ORG 0 ; some boot sector code TIMES 510-($-$$) DB 0 DW 0xAA55 'TIME'��������������в����㹻��������ѻ����Ƶ�510.���ְ취����һ�� �ô�,������������������������з�����̫�������,���³�������,NASM�� �ڻ��ʱ��⵽�������,������.���������վͲ����ػ�ಢȥ�ҳ���������. 10.1.4 `TIMES'����������. ��������������һ���ձ��Ե�������,��������д'TIMES'��һ��: TIMES 510-$ DB 0 ��Ϊ'$'��һ��������,����510,�������������ֵҲ��һ��������,���Ժܺõ� ��TIMESʹ��. NASM��һ��ģ�黯�Ļ����:��ͬ����ɲ��ֱ����Ϊ���Ժ����׵ĵ�������,�� �����Dz��ύ��һЩ����Ҫ����Ϣ.���,'BIN'�����ʽ���ܱ�'ORG'��֪'.text' ��Ӧ����0����ʼ,���Dz����������Ϣ��������ʽ����ֵ����.���Զ���ֵ���� ����,'$'����һ������ֵ:����һ����һ���λ�ַ��ʼ��ƫ��ֵ.��Ϊ'$'��510'֮ ��ļ�����Ҳ����һ������,���Ǻ���һ���λ�ַ.����һ���λ�ַ�Ľ���Dz��� ��Ϊ�������ݸ�'TIMES'��. �������������һ����������,Ӧ������: TIMES 510-($-$$) DB 0 ������,'$'��'$$'�Ǵ�ͬһ���λ�ַ��ƫ��,������������Ľ����һ������,�� ����������������,��������ȷ�Ĵ���. 10.2 Bugs ���ǻ�����û�з�����һ��������֪BUG��NASM�汾.������δ֪��BUG�������Dz� ͣ�س���.�㷢�����κ�BUG,Ӧ������ͨ���� `https://sourceforge.net/projects/nasm/'(���bug)��'bugtracker'�ύ�� ����,���������������,��ͨ��1.2�е�ijһ����ϵ��ʽ. �����Ķ�2.2,�벻Ҫ�������Ƕ�����Ϊ���ԵĶ�����ΪBUG�ύ������.(������� Ϊ������Ժܲ���,�������������Ϊ��Ӧ�����޸ĵ�ԭ��,�����ǽ���������һ ��'����һ��BUG')Ȼ�����Ķ�10.1,�벻Ҫ���Ѿ����������BUG�ύ������. ������ύһ��bug,������������������Ϣ. (�ⲿ����Ϣһ���û���������,��Щʡ��,ԭ����ο�NASM��Ӣ���ĵ�.) ��¼A: Ndisasm ------------------- �������, NDISASM A.1 ��� ��������ǻ����NASM��һ����С�ĸ���Ʒ.�����Ѿ�ӵ��һ������������ָ�� ����x86�����,����������ָ����������ܵ���������,�ƺ��ܿ�ϧ,���� �����ּ���һ���������,������NASM��ָ���(��������һЩ����) ���������������������Դ�ļ��ķ����.NDISASM�������κ�Ŀ���ļ���ʽ,�� ��'objdump',Ҳ������'DOS .EXE'�ļ�,����'debug',�����������. A.2 ��ʼ: ��װ. ����1.3�İ�װָ��.NDISASM����NASM,Ҳ��һ������ҳ,�������һ��UNIXϵͳ��, �����ϣ����������һ�����õĵط�. A.3 ����NDISASM Ҫ�����һ���ļ�,���������������ʹ������: ndisasm [-b16 | -b32] filename NDISASM���Ժ����׵ط����16λ��32λ����,��Ȼ,ǰ���������ǵø���ָ���� ���ַ�ʽ.���'-b'����û��,NDISASMȱʡ������16λģʽ��.'-u'����Ҳ����32λ ģʽ. ��������������ѡ��,'-r'��ӡ�������е�NDISASM�İ汾��,'-h'����һ���й��� ����ѡ��ļ�̽���. A.3.1 COM�ļ�: ָ������ַ. Ҫ��ȷ�����һ��'DOS.COM'�ļ�,�����������֪���ļ��еĵ�һ��ָ���DZ�װ�� ����ַ'0x100'����,������0,NDISASMȱʡ����Ϊ�������ÿһ���ļ�����װ�ص�0 ����,����������������һ��. '-o'ѡ��������Ϊ��������������һ����ͬ����ʼ��ַ.���IJ����������κ� NASM��ֵ��ʽ:ȱʡ��ʮ����,�������''$''��''0x''��ͷ,����''H'��β,����ʮ �����Ƶ�,�����''Q''��β,����8���Ƶ�,�����''B''��β,���Ƕ����Ƶ�. ����,�����һ��'.COM'�ļ�: ndisasm -o100h filename.com �ܹ���ȷ�����. A.3.2 ����ǰ������: ͬ��. �������������һ������һЩ���ǻ���������ݵ��ļ�,����ļ���ȻҲ����һЩ ������.NDISASM��ܳ�ʵ��ȥ�о����ݶ�,����������ȥ��������ָ��(���������� �Ĵ��������ȥ�����,������Щ�����в�������ǰ׺,����:'FS OR AX, 0x240A'') Ȼ��,���ᵽ�����δ�. ����NDISASM�ո���ɴ�һ�����ݶ��в���һ����ֵĻ���ָ��,�������ڵ�λ���� ���ڴ���ε�ǰ��һ���ֽڴ�.����ȫ�п��������ݶε����һ���ֽ�Ϊ��ʼ������ һ����ָ��,Ȼ��,������еĵ�һ����ȷ��ָ��Ϳ�������,��Ϊ����Ѿ��������� ָ��,��ȷʵ���Ǻ�����. Ϊ�˱�����һ��,�����ָ��һ��'ͬ��'��,���߿���ָ������Ҫ��ͬ�������Ŀ(�� NDISASM�������ڲ�ֻ�ܴ���8192��ͬ����).ͬ����Ķ�������:NDISASM��֤�ᵽ�� ���ͬ����.�������Ϊij��ָ�������һ��ͬ����,�����������ָ��,��֮��һ�� 'DB'.���������ͬ���㴦��ʼ�����,��������Կ�����Ĵ�����е�����ָ��. ͬ��������'-s'ѡ����ָ����:�����Դӳ���ʼ���ľ���������,�������ļ�λ��. ���������Ҫ��32bytes��ʼͬ��һ��'.COM'�ļ�,�����������: ndisasm -o100h -s120h file.com ������: ndisasm -o100h -s20h file.com ����������������,�������Ҫ,�����ָ�����ͬ���Ǻ�,ֻҪ�ظ�'-s'ѡ���. A.3.3 ��������ݻ��: �Զ�(����)ͬ��. ���������ڷ����һ��'DOS'������������(���������в���,������Ҫ���ⲡ��,�� ����Ϳ���֪�������ܻ�����ϵͳ���ʲô������).һ���,����Ậ��'JMP' ָ��,Ȼ��������,Ȼ����������Ǵ���,����,��ܿ��ܻ���NDISASM������������ ���뽻�Ӵ��Ҳ�����ȷ�ĵ�,����ͬ�����DZ����. ��һ����,��ΪʲôҪ�ֹ�ָ��ͬ������?��Ҫ�ҳ�����ͬ����ĵ�ַ,��Ȼ�ǿ��� ��'JMP'�ж�ȡ,Ȼ�����������Ŀ���ַ��Ϊһ��ͬ����,��NDISADM�Ƿ����Ϊ�� ������һ��? �𰸵�Ȼ�ǿ���:ʹ��ͬ������'-a'(�Զ�ͬ��)��'-i'(����ͬ��)������'�Զ�ͬ�� "ģʽ.�Զ�ͬ��ģʽΪPC��ص�ǰ�����û����ָ���Զ�����ͬ����.(��ΪNDISASM ��һ���,���������һ��Ŀ���ַ�Ѿ�����������PC��ص���ת,��������ʲô.) ֻ��PC��ص�jump�Żᱻ����,��Ϊһ��������ת����ͨ��һ���Ĵ���(��������� ��,NDISASM��֪������Ĵ����к���ʲô)����һ���ε�ַ(�����������,Ŀ��� �벻��NDISASM�����ĵ�ǰ����,����ͬ���㲻�ܱ���ȷ������) ����һЩ���͵��ļ�,���ֻ��ƻ��Զ���ͬ����ŵ�������ȷ��λ��,�������㲻�� �ֹ�����ͬ����.����,��Ҫǿ�������Զ�ģʽ�����ܱ�֤�ҳ����е�ͬ����,����� ������Ҫ�ֹ�����ͬ����. �Զ�ͬ��ģʽ�����ֹ���ֹ�����ͬ����:������ֻ�ǰ��Զ�������ͬ�������.ͬ ʱָ��'-i'��'-s'ѡ������ȫ���е�. �����Զ�ͬ��ģʽ,��һ����Ҫ���ѵ���,�����ΪһЩ���������,������ݶ��е� һЩ���ݱ���������PC��صĵ��û���תָ��,NDISASM���ܻ�ܳ�ʵ�ذ�ͬ����� �����е���Щλ��,����,����Ĵ�����е�ij��ָ����м�λ��.ͬ��,���Dz���Ϊ�� ��ʲô,�����������,�㻹�DZ���ʹ���ֹ�ͬ����,��ʹ��'-k'ѡ��(�������)���� ֹ������ķ����. A.3.4 ����ѡ��. '-e'ѡ��ͨ������һ���ļ���ͷ��N��bytes������һ���ļ����ļ�ͷ.���ʾ�ڷ��� ������,�ļ�ͷ������ƫ������:��������'-e10 -o10',�����������ļ���ʼ�� 10byte����ʼ,������ƫ�������10,������20. '-k'ѡ�������������--�ָ���ֵ����,��һ���ǻ������,�ڶ�����������byte��. ���Ǵӻ��ƫ��������ʼ����������ֽ���:������;�ǽ�ֹ����Ҫ�����ݶα����� ��. A.4 Bug�͸Ľ�. ���ڻ�û����֪��bug.����,����㷢����,�����˲���,�뷢��`jules@dsf.org.uk' ��`anakin@pobox.com', ������`https://sourceforge.net/projects/nasm/'�ϵ� ����վ��,���ǻ�Ľ�����,��������ǸĽ��������ԵĽ���. �����ļƻ�������֪���ض���ָ�����������ִ�������,���ܱ����Щ����ijЩ���� ����˵���ڸ߼���ָ��(����'FPU'ָ��,����û�й����IJ�����, ������Ȩ����ģʽ ָ��,��������). ��л���е�����! ��ϣ��NDISASM��һЩ����˵�����õ�,������.:-) �Ҳ��Ƽ���NDISASM��������,�Կ���һ����������Ĺ�������,��Ϊ��ĿǰΪֹ,�� ����֪,������һ�������ܵķ������,��Ӧ����ȷ��һ��. (��)