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

📄 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	{}

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

⌨️ 快捷键说明

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