学 Win32 汇编[34] - 宏汇编(1)
摘要:从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解.宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ、textequ 或 = 来代替, 但宏有更复杂的功能."宏" 的本质是 "替换", 但又像极了 "子过程";所以即有宏过程(macro procedure)、也有宏函数(macro function).它既以有参数(可以是: 常数、变量...
阅读全文
posted @
2010-04-29 21:34
万一
阅读(4792)
推荐(2) 编辑
学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
摘要:我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.这在 RadASM 环境中可通过...
阅读全文
posted @
2010-04-29 14:01
万一
阅读(2502)
推荐(0) 编辑
学 Win32 汇编[32] - 子程序进阶
摘要:接: http://www.cnblogs.com/del/archive/2010/04/05/1704864.html这是以前的一个求和函数的例子把上面的例子改为用寄存器传递参数:如果调用的函数在之后实现, 须用 PROTO 提前声明:测试 StdCall 模式下的参数压栈顺序:子程序可以指定语言模式(StaCall、C、SysCall、Basic、Fortran、Pascal);如果不指定则...
阅读全文
posted @
2010-04-26 14:28
万一
阅读(2908)
推荐(0) 编辑
学 Win32 汇编[31] - 结构与联合
摘要:结构和联合分别用 struct、union 定义, 都是 ends 结束定义.它们使用方法相同, 并可以互相嵌套; 主要区别是后者的各成员共用同一个地址.结构示例:联合示例:用寄存器引用结构变量:定义时的数据初始化:使用 SYSTEMTIME 结构获取系统时间的例子:结构嵌套:
阅读全文
posted @
2010-04-22 15:26
万一
阅读(2482)
推荐(0) 编辑
学 Win32 汇编[30] - 条件及循环伪指令: .IF、.WHILE、.REPEAT 等
摘要:.IF、.ELSEIF、.ELSE、.ENDIF: 条件伪指令.WHILE、.ENDW: While 循环伪指令:.REPEAT、.UNTIL: Repeat 循环伪指令:.While 与 .Repeat 都支持 .Break 和 .Continue.WHILE 与 .BREAK:.REPEAT 与 .CONTINUE:
阅读全文
posted @
2010-04-21 17:26
万一
阅读(7048)
推荐(1) 编辑
学 Win32 汇编[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等
摘要:这里的 "串" 并不单指字符串, 包括所有连续的数据(如数组); 串指令只用于内存操作.MOVSB: 移动字符串上面的例子, 假如不使用重复前缀...MOVSD 例:MOVSW 例:CMPSD 例:CMPSW 例:对比数组时, 假如数组长度不一致...如果对比的是 0 结束的字符串, 长度不一致也不用考虑SCASB 例:STOSB 例:LODSW 例: 数组求和
阅读全文
posted @
2010-04-17 22:55
万一
阅读(7100)
推荐(0) 编辑
学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
摘要:跳转指令分三类:一、无条件跳转: JMP;二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.根据标志位跳转的指令:跳转相关的标志位:11109876543210OFDFIFTFSFZF AF PF CF溢出 符号零未用辅助未用奇偶未用进位JMP 测试JE 测试JZ 测试JS...
阅读全文
posted @
2010-04-16 20:46
万一
阅读(102105)
推荐(12) 编辑
学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
摘要:MUL: 无符号乘IMUL: 有符号乘DIV、IDIV: 无符号除、有符号除
阅读全文
posted @
2010-04-15 21:17
万一
阅读(15372)
推荐(0) 编辑
学 Win32 汇编[25] - 符号扩展指令: CBW、CWDE、CDQ、CWD
摘要:CBW、CWDE、CDQ、CWD: 扩展指令符号扩展指令的本质CBW、CWDE 和 MOVSX 的关系
阅读全文
posted @
2010-04-15 15:13
万一
阅读(13932)
推荐(0) 编辑
学 Win32 汇编[24] - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD
摘要:SHL、SHR、SAL、SAR: 移位指令ROL、ROR、RCL、RCR: 循环移位指令SHLD、SHRD: 双精度移位
阅读全文
posted @
2010-04-15 11:39
万一
阅读(11483)
推荐(1) 编辑
学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
摘要:AND: 逻辑与OR: 逻辑或XOR: 逻辑异或NOT: 逻辑取反TEST: 测试逻辑与
阅读全文
posted @
2010-04-14 15:30
万一
阅读(20651)
推荐(0) 编辑
学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX
摘要:汇编指令的一般性要求: 1、两个操作数的尺寸必须一致; 2、操作数不能同为内存.MOV(Move): 最常用的数据传送指令LEA(Load Effective Address): 有效地址传送指令XCHG(Exchange): 交换指令XLATB(Translate Byte)、XLAT(Translate): 换码指令MOVZX(Move With Zero-Extend): 零扩展传送MOVS...
阅读全文
posted @
2010-04-14 10:19
万一
阅读(7165)
推荐(0) 编辑
学 Win32 汇编[20]: 洞察标志寄存器
摘要:1514131211109876543210 NTIOPLOFDFIFTFSFZF AF PF CF未使用嵌套标志I/O权限标志占2位溢出标志方向标志中断允许标志单步标志符号标志零标志未使用辅助标志未使用奇偶标志未使用进位标志上表是 32 位寄存器 EFLAGS 的低 16 位.不能直接读写 EFLAGS, 但有些方便的指令, 如:LAHF: 读取EFLAGS 低 8 位到 AH; SAHF 是 ...
阅读全文
posted @
2010-04-13 15:25
万一
阅读(2109)
推荐(0) 编辑
学 Win32 汇编[19]: 查看二进制等相关函数
摘要:在 masm32.inc 中有这样几个函数的声明:byt2bin_ex: 从 Byte 数到二进制字符串wrd2bin_ex: 从 Word 数到二进制字符串dw2bin_ex: 从 DWord 数到二进制字符串dw2hex_ex: 从 DWord 数到十六进制字符串bin2byte_ex: 从字符串(必须有 8 个 '0' 或 '1' 组成)到字节学习查看二进制是为了看到 EFLAGS 中的二进...
阅读全文
posted @
2010-04-13 12:36
万一
阅读(2253)
推荐(0) 编辑
学 Win32 汇编[18]: 关于压栈(PUSH)与出栈(POP) 之二
摘要:由于 "栈" 是由高到低使用的, 所以新压入的数据的位置更低.ESP 中的指针将一直指向这个新位置, 所以 ESP 中的地址数据是动态的.每次 PUSH, ESP = ESP - x; 每次 POP, ESP = ESP + x;其中的 x 只能是 4 或 2, 因为 Win32 的 PUSH 只可以压入 32 位(默认)或 16 位的数据.ESP 有个名字叫 "栈顶", 其实它指向的是栈中最低位...
阅读全文
posted @
2010-04-11 21:45
万一
阅读(9770)
推荐(1) 编辑
学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
摘要:记得刚学多线程的时候, 碰到一个结构:从这个结构中可以基本洞察多线程的基本原理: 1、在切换到另一个线程之前, 先把当前线程在寄存器中的数据保存在这个结构;2、重新切回线程时, 再才这个结构中读出相关数据到寄存器, 从而继续运行...压栈、出栈也是类似的道理.一个程序包含若干子程序, 子程序中一般会有自己的参数或局部变量.在执行这个子程序前, 应该先把寄存器中的相关数据暂存一下(子程序也要使用寄存...
阅读全文
posted @
2010-04-10 18:16
万一
阅读(4325)
推荐(0) 编辑
学 Win32 汇编[16]: 常用寄存器的常规功能
摘要:通用寄存器EAX累加(Accumulator)寄存器AX(AH、AL)常用于乘、除法和函数返回值EBX基址(Base)寄存器BX(BH、BL)常做内存数据的指针, 或者说常以它为基址来访问内存.ECX计数器(Counter)寄存器CX(CH、CL)常做字符串和循环操作中的计数器EDX数据(Data)寄存器DX(DH、DL)常用于乘、除法和 I/O 指针ESI来源索引(Source Index)寄存...
阅读全文
posted @
2010-04-09 13:53
万一
阅读(4590)
推荐(1) 编辑
学 Win32 汇编[15]: LOOP 与标号
摘要:Loop 是反复执行;从哪反复? 这要用到 "标号";反复几次? 把反复的次数告诉 ECX 寄存器即可.笨办法计算 3 * 8 = 24使用 LOOP 和标号:数组求和的例子:复制字符串的例子:如果仅仅是复制字符串, 可以使用声明在 masm32.inc 中的 szCopy 函数:关于 @@、@B、@F:关于全局标号:
阅读全文
posted @
2010-04-08 17:02
万一
阅读(3108)
推荐(0) 编辑