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