
汇编
zzc1684
这个作者很懒,什么都没留下…
展开
-
学 Win32 汇编[10]: TYPE、$、LENGTHOF、SIZEOF、TYPEDEF
TYPE: 获取类型大小, 对数组是获取每个元素的大小; Test10_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libinclu...原创 2011-12-12 13:22:35 · 816 阅读 · 0 评论 -
学 Win32 汇编[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等
这里的 "串" 并不单指字符串, 包括所有连续的数据(如数组); 串指令只用于内存操作. 移动串指令: MOVSB、MOVSW、MOVSD ;从 ESI -> EDI; 执行后, ESI 与 EDI 的地址移动相应的单位比较串指令: CMPSB、CMPSW、CMPSD ;比较 ESI、EDI; 执行后, ESI 与 EDI 的地址移动相应的单位扫描串指令: SCASB、S...原创 2011-12-20 09:47:33 · 610 阅读 · 0 评论 -
学 Win32 汇编[30] - 条件及循环伪指令: .IF、.WHILE、.REPEAT 等
.IF、.ELSEIF、.ELSE、.ENDIF: 条件伪指令;可以使用和 C 语言类似的条判断:a == ba != ba > ba >= ba < ba <= ba && ba & ba || b!a;还可以直接判断几个常用的标志位:CARRY? ;进位标志OVERFL...原创 2011-12-20 09:48:10 · 548 阅读 · 0 评论 -
学 Win32 汇编[31] - 结构与联合
结构和联合分别用 struct、union 定义, 都是 ends 结束定义.它们使用方法相同, 并可以互相嵌套; 主要区别是后者的各成员共用同一个地址. 结构示例:; Test31_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm3...原创 2011-12-20 09:48:54 · 118 阅读 · 0 评论 -
学 Win32 汇编[32] - 子程序进阶
接: 学 Win32 汇编[9]: 子过程中的变量声明 这是以前的一个求和函数的例子; Test32_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib k...原创 2011-12-20 09:49:48 · 169 阅读 · 0 评论 -
学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.这在 RadASM 环境中可通过...原创 2011-12-22 13:23:45 · 105 阅读 · 0 评论 -
学 Win32 汇编[34] - 宏汇编(1)
从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解.宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ、textequ 或 = 来代替, 但宏有更复杂的功能."宏" 的本质是 "替换", 但又像极了 "子过程";所以即有宏过程(macro procedure)、也有宏函数(macro function).它既以有参数(可以是: 常数、变量...原创 2011-12-22 13:25:23 · 125 阅读 · 0 评论 -
reverseArgs macro arglist:VARARG
reverseArgs macro arglist:VARARG local txt,count txt TEXTEQU <> count = 0 for i, <arglist> count = count + 1 txt TEXTEQU @CatStr(i, <!,> , <%tx...原创 2011-12-02 09:27:59 · 205 阅读 · 0 评论 -
汇编指令速查
指令功能AAA调整加AAD调整除AAM调整乘AAS调整减ADC进位加ADD加AND与ARPL调整优先级BOUND检查数组BSF位右扫描BSR位左扫描BSWAP交换字节BT位测试BTC位测试求反BTR位测试清零...原创 2011-12-08 08:27:36 · 235 阅读 · 0 评论 -
学 Win32 汇编[1]: 选择编辑与编译工具
Win32 汇编工具主要有 MASM 和 TASM; 我选择前者, 理由是使用范围广, 便于交流.根据介绍, 我先下载了 MASM32(http://www.masm32.com/), 发现不错, 但不是我最想要的.后来找到了 RadASM(官方地址: http://www.oby.ro/rad_asm/index.html)我最终选择了 cao_cong 做的 RadASM 汉化集成包(http...原创 2011-12-08 08:29:56 · 104 阅读 · 0 评论 -
学 Win32 汇编[2]: 最简单的 Win32 程序
; Test2_1.asm.386.model flat, stdcallinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib.data szCaption db 'Hi', 0 szM...原创 2011-12-08 08:33:18 · 114 阅读 · 0 评论 -
学 Win32 汇编[3]: 控制台下的几种输出方式
在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输出显示的手段.我刚开始学习时使用的是控制台输出, 最后发现既然是 Win32 汇编还是用 Debug 输出更好.下面是之前尝试出的控制台输出的几种办法:1、使用 MASM 提供的 StdOut 函数;2、使用系统 API: 3、使用微软 C 标准库 msvcrt.dll 中的 printf 函数.使用 MASM 的 StdOut 函数:;...原创 2011-12-08 08:35:39 · 225 阅读 · 0 评论 -
学 Win32 汇编[4]: 使用 Debug 输出测试结果
由于 Debug 输出是使用的标准的 Win32 窗口, 所以 include 和 includelib 的文件较多.这样建立工程时就不需要是控制台程序了, 工程建立方法:文件 -> 新建工程 -> 工程类型: Win32 App (no res) ... PrintString: 输出字符串变量; Test4_1.asm.386.model flat, stdca...原创 2011-12-08 08:38:08 · 156 阅读 · 0 评论 -
学 Win32 汇编[5]: 数据类型与声明
类型描述类型缩写位数字节数浮点数有效位数值范围字节BYTEDB81 0..255有符号字节SBYTEDB81 -128..127字WORDDW162 0..65535有符号字SWORDDW162 -32768..32767双字DWORD...原创 2011-12-10 18:40:27 · 103 阅读 · 0 评论 -
学 Win32 汇编[6]: 伪指令 DUP 与数组
声明数组实例:; Test6_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libinc...原创 2011-12-10 18:41:02 · 276 阅读 · 0 评论 -
学 Win32 汇编[7]: 定义字符串
例一; Test7_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludel...原创 2011-12-10 18:41:22 · 249 阅读 · 0 评论 -
学 Win32 汇编[8]: 算术运算符、关系操作符、逻辑操作符、高低分离符和移位运算符...
算术运算符名称优先级()圆括号1+,-正、负2*,/乘、除3MOD取模3+,-加、减4算术运算符示例:; Test8_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incin...原创 2011-12-10 18:41:49 · 467 阅读 · 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 寄存器的标志位跳转, 这个太多了.根据标志位跳转的指令: JE ;等于则跳转JNE ;不等于则跳转JZ ;为 0 则跳转JNZ ;不为 0 则跳转JS ;为负则跳转J...原创 2011-12-20 09:46:19 · 245 阅读 · 0 评论 -
学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
MUL: 无符号乘;影响 OF、CF 标志位;指令格式:;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX; Test27_1.asm.386.mod...原创 2011-12-19 09:03:27 · 484 阅读 · 0 评论 -
学 Win32 汇编[11]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)
32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度;但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.准备使用的测试文件:; Test11_1.asm.586.model flat, stdcall...原创 2011-12-12 13:23:04 · 148 阅读 · 0 评论 -
学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS
PTR: 指定要操作的数据尺寸; Test12_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32...原创 2011-12-12 13:23:38 · 249 阅读 · 0 评论 -
学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)
=、EQU、TEXTEQU 功能差不多, 它们定义的符号都将在编译前辈替换成它们指定的常量值.相比之下 EQU 更好用些. = 举例; Test13_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude ...原创 2011-12-12 13:24:08 · 536 阅读 · 0 评论 -
学 Win32 汇编[14]: 使用中括号 []
[地址] 是取地址指向的内容:; Test14_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32...原创 2011-12-12 13:24:49 · 126 阅读 · 0 评论 -
学 Win32 汇编[15]: LOOP 与标号
Loop 是反复执行;从哪反复? 这要用到 "标号";反复几次? 把反复的次数告诉 ECX 寄存器即可. 笨办法计算 3 * 8 = 24; Test15_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude...原创 2011-12-13 14:25:28 · 152 阅读 · 0 评论 -
学 Win32 汇编[16]: 常用寄存器的常规功能
通用寄存器EAX累加(Accumulator)寄存器AX(AH、AL)常用于乘、除法和函数返回值EBX基址(Base)寄存器BX(BH、BL)常做内存数据的指针, 或者说常以它为基址来访问内存.ECX计数器(Counter)寄存器CX(CH、CL)常做字符串和循环操作中的计数器EDX数据(Data)寄存器DX(D...原创 2011-12-13 14:26:41 · 100 阅读 · 0 评论 -
学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述PContext = ^TContext;_CONTEXT = record ContextFlags: DWORD; Dr0: DWORD; Dr1: DWORD; Dr2: DWORD; Dr3: DWORD; Dr6: DWORD; Dr7: DWORD; Flo...原创 2011-12-13 14:27:13 · 191 阅读 · 0 评论 -
学 Win32 汇编[18]: 关于压栈(PUSH)与出栈(POP) 之二
由于 "栈" 是由高到低使用的, 所以新压入的数据的位置更低.ESP 中的指针将一直指向这个新位置, 所以 ESP 中的地址数据是动态的.每次 PUSH, ESP = ESP - x; 每次 POP, ESP = ESP + x;其中的 x 只能是 4 或 2, 因为 Win32 的 PUSH 只可以压入 32 位(默认)或 16 位的数据.ESP 有个名字叫 "栈顶", 其实它指向的是栈中最低位...原创 2011-12-13 14:28:00 · 429 阅读 · 0 评论 -
学 Win32 汇编[19]: 查看二进制等相关函数
在 masm32.inc 中有这样几个函数的声明: byt2bin_ex PROTO :BYTE, :DWORDwrd2bin_ex PROTO :WORD, :DWORDdw2bin_ex PROTO :DWORD, :DWORDdw2hex_ex PROTO :DWORD, :DWORDbin2byte_ex PROTO :DWORDbyt2bin...原创 2011-12-14 13:20:46 · 187 阅读 · 0 评论 -
学 Win32 汇编[20]: 洞察标志寄存器
1514131211109876543210 NTIOPLOFDFIFTFSFZF AF PF CF未使用嵌套标志I/O权限标志占2位溢出标志方向标志中断允许标志单步标志符号标志零标志未使用辅助标志未使用奇偶标志未使用进位标志上表是 32 位寄存器 ...原创 2011-12-14 13:21:18 · 142 阅读 · 0 评论 -
学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX
汇编指令的一般性要求: 1、两个操作数的尺寸必须一致; 2、操作数不能同为内存.MOV(Move): 最常用的数据传送指令;该指令不影响 EFlags;指令格式: (其中的 r、m、i 分别表示: 寄存器、内存、立即数)MOV r/m, r/m/i; Test21_1.asm.386.model flat, stdcallinclude windows....原创 2011-12-14 13:22:00 · 365 阅读 · 0 评论 -
学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
AND: 逻辑与;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF;指令格式:AND r/m, r/m/i; Test22_1.asm - 使用 AND 运算将一个数的第二、四位清零.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude m...原创 2011-12-14 13:23:13 · 300 阅读 · 0 评论 -
学 Win32 汇编[23] - 位测试与位扫描指令: BT、BTC、BTR、BTS、BSF、BSR
BT、BTS、BTR、BTC: 位测试指令;BT(Bit Test): 位测试;BTS(Bit Test and Set): 位测试并置位;BTR(Bit Test and Reset): 位测试并复位;BTC(Bit Test and Complement): 位测试并取反;它们的结果影响 CF;它们的指令...原创 2011-12-19 09:00:51 · 430 阅读 · 0 评论 -
学 Win32 汇编[24] - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD
SHL、SHR、SAL、SAR: 移位指令;SHL(Shift Left): 逻辑左移;SHR(Shift Right): 逻辑右移;SAL(Shift Arithmetic Left): 算术左移;SAR(Shift Arithmetic Right): 算术右移;其中的 SHL 和 SAL 相同, 但 SHR 和 S...原创 2011-12-19 09:01:25 · 236 阅读 · 0 评论 -
学 Win32 汇编[25] - 符号扩展指令: CBW、CWDE、CDQ、CWD
CBW、CWDE、CDQ、CWD: 扩展指令;CBW(Convert Byte to Word): 将 AL 扩展为 AX;CWDE(Convert Word to Extended Double): 将 AX 扩展为 EAX;CDQ(Convert Doubleword to Quadword): 将 EAX 扩展为 64 位数 EDX:EAX;...原创 2011-12-19 09:01:52 · 562 阅读 · 0 评论 -
学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP
;INC(Increment): 加一;DEC(Decrement): 减一;NEG(Negate): 求补(求反);ADD(Add): 加;ADC(Add Carry): 带进位加;SUB(Subtract): 减;SBB(Subtract With Borrow): 带进位减;CMP(Compare): 比较;INC、DEC、NEG 的指令格式:;INC r/m;ADD...原创 2011-12-19 09:02:25 · 308 阅读 · 0 评论 -
学 Win32 汇编[9]: 子过程中的变量声明
定义子过程的伪指令: PROC、ENDP; Test9_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib ma...原创 2011-12-10 18:42:13 · 135 阅读 · 0 评论