www.pudn.com > c++_asm混合.rar > asm1.asm
COMMENT | 这是注释这是注释这是注释这是注释这是注释 这是注释这是注释这是注释这是注释 这是注释,在遇到 | 结束 echo 在MSDN中输入 "MASM (Microsoft Macro Assembler)" 就可得到MASM的帮助 %OUT 在MSDN中输入 "MASM (Microsoft Macro Assembler)" 就可得到MASM的帮助 ; Custom Build Step (for sieve.asm/sieve.obj), including a listing file placed in intermediate directory ; but without Source Browser information ; Command Line (debug): ; ml -c -Zi "-Fl$(IntDir)\$(InputName).lst" "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)" ; Command Line (release): ; ml -c "-Fl$(IntDir)\$(InputName).lst" "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)" ; Outputs: ; $(IntDir)\$(InputName).obj ; Additional Dependencies: ; $(InputDir)\$(InputName).inc ; Custom Build Step (for sieve.asm/sieve.obj), including a listing file placed in intermediate directory ; and Source Browser information also placed in intermediate directory ; Command Line (debug): ; ml -c -Zi "-Fl$(IntDir)\$(InputName).lst" "-FR$(IntDir)\$(InputName).sbr" "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)" ; Command Line (release): ; ml -c "-Fl$(IntDir)\$(InputName).lst" "-FR$(IntDir)\$(InputName).sbr" "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)" ; Outputs: ; $(IntDir)\$(InputName).obj;$(IntDir)\$(InputName).sbr ; Additional Dependencies: ; $(InputDir)\$(InputName).inc .686p .8087 .K3D .MMX .XMM ;.RADIX 16 .MODEL FLAT, stdcall ;没有fastcall ; case sensitive,表达式为32位,不仿真浮点指令,代码段只读,段是32位段 ;空格多了不行 ;OPTION CASEMAP :NONE, EXPR32, NOEMULATOR,READONLY, SEGMENT:use32 ;用此句可以,用上句不行 OPTION CASEMAP :NONE, EXPR32, NOEMULATOR, READONLY, SEGMENT:use32 ;use16不行 PUSHCONTEXT all ;保存汇编器标志 ;include windows.inc ;include masm32.inc ;include gdi32.inc ;include user32.inc ;include kernel32.inc include testh2inc.inc POPCONTEXT all ;弹出汇编器标志 ;extra ll4:far gc_MAX_INT EQU 64 gc_MAX_INT2 = 14 gs_DISP_STRING TEXTEQU;//RECORD 最多为32为,且声明时要在一行上,不能换行 BitRecord RECORD Hightbits:4, Midbits:gc_MAX_INT2, Lsb:8 FullName STRUCT FirstNmae BYTE 15 DUP(?) Initial BYTE ? LastName BYTE 24 DUP (?) FullName ends FullName2 STRUCT firstname2 byte '--------------------' initial2 byte '-' lastname2 byte '---------------' FullName2 ends point struct people1 FullName2 {} people2 FullName {} ;嵌套定义时必须用{},而不能用{"asdf", "a", "asdfkl"} x byte ? y byte ? point ends rectangle struct uppperleft point {} ;必须要初始化, lowerrt point {} rectangle ends Ppoint typedef ptr point testmacro1 macro a local lm1 ;使标号局部华,多次引用宏不会出现重定义标号 and ax,a jz lm1 nop lm1: nop endm ;externdef g_fileName ;externdef==(public+extern) ;externdef g_pfileName ;不能这样声明,要加变量的类型, externdef g_fileName : byte externdef g_pfileName : byte EXTERNDEF g_Version : DWORD EXTERNDEF g_Data :BYTE EXTERNDEF g_Time :BYTE EXTERNDEF g_Cpu :DWORD ;EXTERNDEF g_Environ :BYTE EXTERNDEF g_Interface :BYTE ;Information about the language parameters EXTERNDEF g_Line :DWORD .DATA EVEN ;偶地址对齐,必须在某一段内定义,只适合16位数据线 ALIGN 16 ;以16字节的倍数对齐,即128位对齐,适合128数据总线,及一下总线 teststruct1 FullName2 {} teststruct1a FullName 4 dup({}) g_Version DWORD @Version ;××××注意××××所有的symbols 都是大小写敏感的 g_Time BYTE '@Time',0 g_Data BYTE @Date,0 g_Cpu DWORD @Cpu,0 ;g_Environ BYTE @Environ PATH ,0 g_Interface BYTE @Interface,0 ;Information about the language parameters g_Line DWORD @Line ,0 a1 WORD 04371h a2 DWORD 033h ;a3 BitRecord 2; ;a4 OWORD 33h Naba FullName {"Naba", " ", "barkakati"} Mitch FullName {} point1 point {} ;comm testh2inc2 : h2inc2 ;定义公共变量,不能被初始化,不用public了 .CONST ;externdef g_pfileName : label ptr byte ;不能这样定义,externdef 不能用在定义处 FILENAME TEXTEQU @FileName g_pfileName BYTE 'FILENAME',0 g_fileName BYTE '@FileCur',0 ; g_fileName 表示串的地址,而不是一个指针 .CODE Test1 proc val1:DWORD local i1:word,i2:sdword MOV EAX,val1; MUL eax; mov eax,0ffffffffh inc eax nop call testorg1 mov eax, offset testh2inc2; mov [eax].h2inc2.k, 55; testmacro1 0 testmacro1 2 ;mov ecx,offset point1 ;lea eax,[ecx].point.people1.firstname2 ;只能用结构名来索引 ;lea eax,[ecx].people1.firstname2 ;错误的方法 ;lea eax,[ecx].point1.people1.firstname2 ;错误的方法 ;ret mov ax,mask Hightbits and ax,mask Midbits jmp short ll7 ;es::di 用两个寄存器表示一个32位数,addr point1表示一个地址,[ecx]也表示一个地址 invoke testproc1 , 1, addr point1, addr teststruct1 invoke testproc1 , edx, [ecx], es::di ;jmp LoadLibraryA nop ll7: fild val1 ll6: fmul st,st(0) mov eax,0 CPUID ;用小写的cpuid 就不行 mov eax,1 CPUID mov eax,2 CPUID mov eax,i2; ret ;//根据过程的调用方式自动正确返回 Test1 endp testproc1 proc near stdcall export uses ecx edx ebx esi edi ,var1:SDWORD ,var2:SDWORD, var6:SDWORD local var3:ptr byte, var4:Ppoint mov eax,var1 mov ecx,var3 mov [ecx], al mov ebx,var2 mov var4, ebx ret testproc1 endp ;org 500000h ;是相对于本偏移在加一个偏移 ;org (500000 ) testorg1 proc ret testorg1 endp TestFloat1 PROC STDCALL d1:REAL8, f1:REAL4, f2:REAL4, pcomplex1:PTR COMPLEXF_SLIB, nLevel:SDWORD local var1:REAL8, var2:REAL4, var3:REAL4, var4:REAL4, var5:ptr COMPLEXF_SLIB, nCount:SDWORD, tmp1:SDWORD, i:SDWORD ;(pCWork1[i + nInter] - pCWork1[i + nInter + nBtFlyLen / 2]) ;* pCW[(int)(i * pow((float)2,k))];*/ ;LENGTH arr = sizeof(arr)/sizeof(arr[0]) 8 ;SIZE arr = sizeof(arr) 32 ;TYPE arr = sizeof(arr[0]) 4 MOV EAX,LENGTH g_Interface; MOV EBX,SIZE g_Interface; MOV ECX,SIZEOF g_Interface; MOV EAX,LENGTH var3 MOV EBX,SIZE var3 MOV ECX,SIZEOF var4 MOV EAX,LENGTH teststruct1a ;数组元素的个数 MOV EBX,SIZE teststruct1a ;整个数组的长度 MOV ECX,SIZEOF teststruct1a ;整个数组的长度 MOV EAX, TYPE(tagComplexf_slib) MOV EAX, SIZE(tagComplexf_slib) MOV EAX, SIZEOF(tagComplexf_slib) ; MOV EAX,ECX; ; MUL EAX,SIZE tagComplexf_slib; 不允许,IMUL可以 ; FSTP [EBX+ECX * TYPE(tagComplexf_slib) ]tagComplexf_slib.real ;不行 ; FSTP [EBX+ECX * (SIZE tagComplexf_slib )]tagComplexf_slib.image;不行 ; FSTP [EBX+ECX * (SIZEOF tagComplexf_slib )]tagComplexf_slib.image;不行 ; FSTP [EBX+ECX * SIZEOF tagComplexf_slib ]tagComplexf_slib.image;不行 ; FSTP [EBX+ECX SIZEOF(tagComplexf_slib)]tagComplexf_slib.image;不行 FLD f1; FDIV f2; =st(0)-??-->st(0) FSTP var1; FLD f1; FDIVR f2; =??- st(0)-->st(0) FSTP var1; FLD f1; FLD f2; FDIV; ;=st(1)-st(0)-->st(1),pop st(0) FSTP var2; FLD1 ; FLD1 ; FADD FLD d1 FDIV ST(0),ST(1) FLD1 ; FLD1 ; FADD fld d1 FDIVR ST(0),ST(1) FLD1 ; FLD1 ; FLD1 ; FLD1 ; FLD1 ; FLD1 ; FLD1 ; FLD1 ; FLD1 ; 多load一次就出错了 FINIT FLD f1; FSUB f2; =st(0)-??-->st(0) FSTP ST(2) FSTP var1; FLD f1; FSUBR f2; =??- st(0)-->st(0) FSTP var1; FLD f1; FLD f2; FSUB; ;=st(1)-st(0)-->st(1),pop st(0) FSTP var2; MOV i,5; FADD ST, ST(0); FST ST(1); MOV ECX, nLevel; DEC ECX; POW_L2: FMUL ST(0),ST(1); LOOP POW_L2; FIMUL i; FISTP tmp1; MOV EBX,pcomplex1 FLD [EBX].tagComplexf_slib.real FLD [EBX].tagComplexf_slib.image MOV EBX, tmp1; IMUL EBX,8 ADD EBX,pcomplex1; FLD [EBX].tagComplexf_slib.real; FLD [EBX].tagComplexf_slib.image; FLD ST(3) FMUL ST(0),ST(2) FLD ST(3) FMUL ST(0),ST(2) FSUBP ST(1),ST(0); FSTP var1 FLD ST(3) FMUL ST(0),ST(1) FLD ST(3) FMUL ST(0),ST(3) FADDP ST(1),ST(0); FSTP var2 FSTP ST(0) FSTP ST(0) FSTP ST(0) FSTP ST(0) ret TestFloat1 ENDP .STACK END