《Windows环境下32位汇编语言程序设计(第2版)》-chapter3补

今天更新一下第三章剩余的部分。

第四章开始介绍窗口的编写和资源文件的使用了,自己看到菜单的使用,自己再琢磨琢磨, 下次再发。

3.3.5变量和使用

	以不同的类型访问变量
	-----------------------------------------------------------------------
	szBuffer db 1024 dup (?)
	mov ax, szBuffer		 ;报错,mov要求等长操作
	mov ax,word ptr szBuffer;正确,地址操作,szBuffer前两个字节赋值给ax
	-----------------------------------------------------------------------
	bTest db 12h
	wTest dw 1234h
	dTest dd 12345678h		;在内存中的情况:1234 1278 5634 12(高->低)
	mov al, bTest			;al = 12h
	mov ax, word ptr wTest	;ax = 3412h
	mov eax, dword ptr dTest;eax = 78123412h
							;地址操作,高位地址存储高位字节
	-----------------------------------------------------------------------							
	movzx					;用0填充
	movsx					;用最高符号位填充
	-----------------------------------------------------------------------	
	变量的尺寸和数量
	-----------------------------------------------------------------------
	sizeof的用法
	stWndClass	WNDCLASS <>				
	szHello		db		 'Hello,world!',0;0结束符算一个字节
	dwTest		dd		 1,2,3,4		 ;4个双字	
	mov eax, sizeof stWndClass   		 ;eax = 40 变量
	mov ecx, sizeof szHello				 ;ecx = 13 变量
	mov esi, sizeof dwTest				 ;esi = 16 变量
	mov edx, sizeof dword				 ;edx = 4  数据类型
	mov ebx, sizeof WNDCLASS			 ;ebx = 40 数据结构
	-----------------------------------------------------------------------
	lengthof
	eax = 1 							 ;只定义了一个WNDCLASS
	ecx = 13							 ;定义了13个byte
	esi = 4 							 ;定义了4个双字
	ebx,edx报错							 ;lengthof + 数据结构/数据类型
	-----------------------------------------------------------------------
	注意:
	szHello db 'Hello', 0dh, 0ah
			db 'world', 0
	sizeof szHello						 ;值为7而不是13,实际中不能用sizeof
										 ;需要用lstrlen
	-----------------------------------------------------------------------
	获取变量的地址
	-----------------------------------------------------------------------
	全局变量
	mov register, offset name
	局部变量
	lea register, [ebp-4][, ebp-8][...]
	invoke语句
	invoke ..., addr gname/lname, ...   ;既不能用offset,也不能用lea
	-----------------------------------------------------------------------
	
3.4使用子程序
	
	子程序的定义
	-----------------------------------------------------------------------
	name proc [参数:类型] ;省略了距离,语言类型,可视区域,寄存器列表
		 local 局部变量表
		 
		 指令
		 
	name endp
	-----------------------------------------------------------------------
	invoke name 		   ;写在子程序之后,不需要声明
	-----------------------------------------------------------------------
	参数的传递和堆栈平衡
	-----------------------------------------------------------------------
	stdCall				   ;从右向左入栈,子程序实现堆栈平衡
	-----------------------------------------------------------------------

3.5高级语法
	
	条件测试语句
	-----------------------------------------------------------------------
	操作符:=, !=, >, >=, <, <=, &(只有这一个位操作), &&, ||, !
	限制条件:表达式的左边只能是寄存器或变量,不能为常数
			   表达式两端不能同时为变量,但可以同时为寄存器
	-----------------------------------------------------------------------
	Flag指示
	CARRY?					;c = 1
	OVERFLOW?				;o = 1
	PARITY?					;p = 1
	SIGN?					;s = 1
	ZERO?					;z = 1
	(eax == ebx) && ZERO?   ;检测eax等于ebx同时z为1
	-----------------------------------------------------------------------
	分支语句
	-----------------------------------------------------------------------
	.if 条件表达式
		指令
	[.elseif]
	[.else]
	.endif
	-----------------------------------------------------------------------
	循环语句
	-----------------------------------------------------------------------
	.while 条件表达式
		指令
		[.break [.if 退出条件]]
		[.continue]
	.endw
	----------------------------------------------------------------------
	.repeat
		指令
		[.break [.if 退出条件]]
		[.continue]
	.until 条件表达式
	-----------------------------------------------------------------------

3.6代码风格
	
	匈牙利表示法
	-----------------------------------------------------------------------
	b    byte
	w    word
	dw   dword 
	h    handle
	lp   pointer
	sz   string with the end of '0'
	lpsz pointer to sz
	f 	 float
	st   struct
	-----------------------------------------------------------------------
	函数名:功能全拼,首字母大写
	-----------------------------------------------------------------------
	全局变量前加_
	局部变量前加@
	程序内部子程序名前加_
	程序内部子程序参数名前加_
	-----------------------------------------------------------------------
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值