📄 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 <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 + -