今天更新一下第三章剩余的部分。
第四章开始介绍窗口的编写和资源文件的使用了,自己看到菜单的使用,自己再琢磨琢磨, 下次再发。
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
-----------------------------------------------------------------------
函数名:功能全拼,首字母大写
-----------------------------------------------------------------------
全局变量前加_
局部变量前加@
程序内部子程序名前加_
程序内部子程序参数名前加_
-----------------------------------------------------------------------