请问汇编一般怎么开头的
c语言要头文件,声明变量什么的、、汇编也类似吗?格式都是怎样的?
答案:org 0000h
jmp start
start:
nop
jmp start
end
其他:先定义用到的段寄存器,如DS,ES(可以没有)
必须定义代码段 例如:CODE:SEGMENT
ASSUME:CS:CODE
START: ··············· ;要编写的程序
CODE ENDS
END START ;--------------------------------------------------------------------------------
;程序的开始信息
;这是第一个窗口的程序,也是以后要用的模板
;--------------------------------------------------------------------------------
.386
.model flat,stdcall
option casemap:none
;所用的一些库都在这里加载
include windows.inc
include gdi32.inc
include user32.inc
include kernel32.inc
includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
;数据段,定义了几个未初始化变量和几个常量
.data?
hInstance dd ?
hWinMain dd ?
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first window!',0
szText db 'win32 assembly,Simple and powerful!',0
;--------------------------------------------------------------------------------
;这里是代码段的开始
;--------------------------------------------------------------------------------
.code
;一个windows需要回调的子程序
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
LOCAL @stPs:PAINTSTRUCT
LOCAL @stRect:RECT
LOCAL @hDc
mov eax,uMsg
.if eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcWinMain endp
;又一个子程序,主要创建窗口用
_WinMain proc
;先定义两个局部变量
LOCAL @stWndClass:WNDCLASSEX ;初始值为系统的WNDCLASSEX结构
LOCAL @stMsg:MSG ;初始值为系统的MSG结构 都是API里的
;调用API 获得一个窗口的句柄
invoke GetModuleHandle,NULL
mov hInstance,eax ;API的返回值eax中,给前面定义的全局变量。
;用来将局部变量初始化为零,局部变量系统不会自动的初始化。里面原来是什么
;数据它就是什么数据,容易出现错误。用到RtlZeroMemory API 清0
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;--------------------------------------------------------------------------------
;一下都是结构里的一些赋值。
invoke LoadCursor,0,IDC_CROSS ;用API 得到光标的类型。
mov @stWndClass.hCursor,eax ;把返回值给WNDCALSSEX结构的hCursor成员
push hInstance ;先前得到的窗口句柄
pop @stWndClass.hInstance ;出栈到 这个结构的这个属性
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain ;制定回调函数
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
;--------------------------------------------------------------------------------
invoke RegisterClassEx,addr @stWndClass ;注册这个有了值结构的窗口
invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ ;注册好后创建这个窗口
offset szClassName,offset szCaptionMain,\ ;里面也有一些初始的信息
WS_OVERLAPPEDWINDOW,\ ;。。。
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax ;将创建窗口API的返回值给一个变量
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;--------------------------------------------------------------------------------
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;程序开始的地方,看start标号
start:
call _WinMain ;调用子程序
invoke ExitProcess,NULL ;调用API,表示程序的结束
end start ORG 0030H
START: SETB P3.7
HERE: MOV P0,#3FH
MOV P2,#3FH
MOV R0,#00H
MOV R1,#00H
MOV DPTR,#TAB
L1: JB P3.7,$
JNB P3.7,$
INC R0
MOV A,R0
MOVC A,@A DPTR
MOV P2,A
CJNE R0,#0AH,L1
L2: INC R1
;CJNE R1,#0AH,HERE ;去掉这条
MOV R0,#00H
MOV P2,#3FH ;加这条
MOV A,R1
MOVC A,@A DPTR
MOV P0,A
CJNE R1,#0AH,l1 ;加这条
AJMP HERE
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
BTW:
程序一般开头这样写比较好
ORG 00H
AJMP START
ORG 30H
。。。
上一个:51单片机汇编写的中断程序返回不了 求解····
下一个:欢迎你向我提问,在8086、单片机汇编方面比较擅长。