您的位置:首页 > 其它

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

2016-07-24 18:13 387 查看
今天更新一下第三章剩余的部分。

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

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
-----------------------------------------------------------------------
函数名:功能全拼,首字母大写
-----------------------------------------------------------------------
全局变量前加_
局部变量前加@
程序内部子程序名前加_
程序内部子程序参数名前加_
-----------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows 32位 汇编