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 {} 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 .STACK END