当前位置:编程学习 > 汇编语言 >>

请问汇编一般怎么开头的

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、单片机汇编方面比较擅长。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,