⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asm1.asm

📁 c++和汇编语言的混合编程例子。 在VC6
💻 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 <HELLO>

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -