转载:Delphi 与汇编入门

Delphi 与汇编入门(万一的Delphi博客)

https://www.cnblogs.com/del/category/121079.html

随笔分类 - Delphi 与汇编入门
 
学 Win32 汇编[34] - 宏汇编(1)
摘要:从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解.宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ、textequ 或 = 来代替, 但宏有更复杂的功能."宏" 的本质是 "替换", 但又像极了 "子过程";所以即有宏过程(macro procedure)、也有宏函数(macro function).它既以有参数(可以是: 常数、变量... 阅读全文
posted @ 2010-04-29 21:34 万一 阅读 (4090) | 评论 (5) 编辑
学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
摘要:我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.这在 RadASM 环境中可通过... 阅读全文
posted @ 2010-04-29 14:01 万一 阅读 (2065) | 评论 (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 万一 阅读 (2276) | 评论 (3) 编辑
学 Win32 汇编[31] - 结构与联合
摘要:结构和联合分别用 struct、union 定义, 都是 ends 结束定义.它们使用方法相同, 并可以互相嵌套; 主要区别是后者的各成员共用同一个地址.结构示例:联合示例:用寄存器引用结构变量:定义时的数据初始化:使用 SYSTEMTIME 结构获取系统时间的例子:结构嵌套: 阅读全文
posted @ 2010-04-22 15:26 万一 阅读 (2058) | 评论 (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 万一 阅读 (5844) | 评论 (0) 编辑
学 Win32 汇编[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等
摘要:这里的 "串" 并不单指字符串, 包括所有连续的数据(如数组); 串指令只用于内存操作.MOVSB: 移动字符串上面的例子, 假如不使用重复前缀...MOVSD 例:MOVSW 例:CMPSD 例:CMPSW 例:对比数组时, 假如数组长度不一致...如果对比的是 0 结束的字符串, 长度不一致也不用考虑SCASB 例:STOSB 例:LODSW 例: 数组求和 阅读全文
posted @ 2010-04-17 22:55 万一 阅读 (5561) | 评论 (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 万一 阅读 (85745) | 评论 (2) 编辑
学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
摘要:MUL: 无符号乘IMUL: 有符号乘DIV、IDIV: 无符号除、有符号除 阅读全文
posted @ 2010-04-15 21:17 万一 阅读 (12004) | 评论 (1) 编辑
学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP
摘要:INC、DEC、NEGADD、ADCSUB、SBBCMP辨析 NEG 与 NOT 阅读全文
posted @ 2010-04-15 17:15 万一 阅读 (16752) | 评论 (0) 编辑
学 Win32 汇编[25] - 符号扩展指令: CBW、CWDE、CDQ、CWD
摘要:CBW、CWDE、CDQ、CWD: 扩展指令符号扩展指令的本质CBW、CWDE 和 MOVSX 的关系 阅读全文
posted @ 2010-04-15 15:13 万一 阅读 (10299) | 评论 (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 万一 阅读 (8491) | 评论 (1) 编辑
学 Win32 汇编[23] - 位测试与位扫描指令: BT、BTC、BTR、BTS、BSF、BSR
摘要:BT、BTS、BTR、BTC: 位测试指令BSF、BSR: 位扫描指令 阅读全文
posted @ 2010-04-15 11:19 万一 阅读 (6396) | 评论 (1) 编辑
学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
摘要:AND: 逻辑与OR: 逻辑或XOR: 逻辑异或NOT: 逻辑取反TEST: 测试逻辑与 阅读全文
posted @ 2010-04-14 15:30 万一 阅读 (16409) | 评论 (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 万一 阅读 (5430) | 评论 (2) 编辑
学 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 万一 阅读 (1596) | 评论 (1) 编辑
学 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 万一 阅读 (1517) | 评论 (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 万一 阅读 (8121) | 评论 (0) 编辑
学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
摘要:记得刚学多线程的时候, 碰到一个结构:从这个结构中可以基本洞察多线程的基本原理: 1、在切换到另一个线程之前, 先把当前线程在寄存器中的数据保存在这个结构;2、重新切回线程时, 再才这个结构中读出相关数据到寄存器, 从而继续运行...压栈、出栈也是类似的道理.一个程序包含若干子程序, 子程序中一般会有自己的参数或局部变量.在执行这个子程序前, 应该先把寄存器中的相关数据暂存一下(子程序也要使用寄存...阅读全文
posted @ 2010-04-10 18:16 万一 阅读 (2792) | 评论 (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 万一 阅读 (3593) | 评论 (1) 编辑
学 Win32 汇编[15]: LOOP 与标号
摘要:Loop 是反复执行;从哪反复? 这要用到 "标号";反复几次? 把反复的次数告诉 ECX 寄存器即可.笨办法计算 3 * 8 = 24使用 LOOP 和标号:数组求和的例子:复制字符串的例子:如果仅仅是复制字符串, 可以使用声明在 masm32.inc 中的 szCopy 函数:关于 @@、@B、@F:关于全局标号: 阅读全文
posted @ 2010-04-08 17:02 万一 阅读 (2208) | 评论 (1) 编辑
学 Win32 汇编[14]: 使用中括号 []
摘要:[地址] 是取地址指向的内容:地址指向的是什么数据?[] 一般用于数组:当然也可以写入数组:好像 [] 不能直接是变量或常数(变量后面跟的 [] 除外). 阅读全文
posted @ 2010-04-08 15:52 万一 阅读 (2881) | 评论 (1) 编辑
学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)
摘要:=、EQU、TEXTEQU 功能差不多, 它们定义的符号都将在编译前辈替换成它们指定的常量值.相比之下 EQU 更好用些.= 举例EQU 例一EQU 例二用 TEXTEQU 重做上一个例子, 完全可行:用 TEXTEQU 重做 EQU 的第一个例子(Test13_2.asm), 有区别: 阅读全文
posted @ 2010-04-07 17:24 万一 阅读 (3933) | 评论 (0) 编辑
学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS
摘要:PTR: 指定要操作的数据尺寸OFFSET: 获取全局变量或标号的偏移地址ADDR: 类似 offset 也是获取变量的地址...获取局部变量的地址只能使用 ADDR:OFFSET 和 ADDR 的异同:1、offset 不能获取局部变量的地址;2、addr 只能用于调用函数(invoke)时, 不能用于赋值操作;3、addr 面对局部变量时会转换为 lea 等指令, addr 面对全局变量时则直... 阅读全文
posted @ 2010-04-07 15:03 万一 阅读 (4408) | 评论 (2) 编辑
学 Win32 汇编[11]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)
摘要:32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度;但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.准备使用的测试文件:ALIGN: 指定对齐边界EVEN 是偶对齐, 相当于 ALIGN 2ORG 可以指定从当前位置... 阅读全文
posted @ 2010-04-06 22:45 万一 阅读 (3553) | 评论 (0) 编辑
学 Win32 汇编[10]: TYPE、$、LENGTHOF、SIZEOF、TYPEDEF
摘要:TYPE: 获取类型大小, 对数组是获取每个元素的大小$: 当前程序语句的地址LENGTHOF: 数组元素个数; SIZEOF: 总字节数TYPEDEF: 创建自定义类型 阅读全文
posted @ 2010-04-06 12:40 万一 阅读 (4334) | 评论 (0) 编辑
学 Win32 汇编[9]: 子过程中的变量声明
摘要:定义子过程的伪指令: PROC、ENDP模仿 C 语言的样子, 以后的程序结构应该这样:局部变量要用 local 声明, 和全局变量区别不小:调用子过程:一个求和函数的例子: 阅读全文
posted @ 2010-04-05 20:23 万一 阅读 (2651) | 评论 (1) 编辑
学 Win32 汇编[8]: 算术运算符、关系操作符、逻辑操作符、高低分离符和移位运算符
摘要:算术运算符名称优先级()圆括号1+,-正、负2*,/乘、除3MOD取模3+,-加、减4算术运算符示例:关系操作符(EQ、NE、LT、LE、GT、GE)示例:逻辑操作符(AND、OR、XOR、NOT)示例:高低分离符(HIGH、LOW、HIGHWORD、LOWWORD)示例:移位运算符(SHL、SHR)示例:以上运算符(或伪指令)有些和汇编(硬)指令重名, 区别在于它们只用于常数表达式, 并在编译期... 阅读全文
posted @ 2010-04-04 20:10 万一 阅读 (3342) | 评论 (11) 编辑
学 Win32 汇编[7]: 定义字符串
摘要:例一例二: 阅读全文
posted @ 2010-04-04 19:08 万一 阅读 (3304) | 评论 (0) 编辑
学 Win32 汇编[6]: 伪指令 DUP 与数组
摘要:声明数组实例:上面的例子也可以这样写:使用伪指令 DUP:现在可以区别未初始化的变量在 .data 段和 .data? 的区别:继续 dup 的例子:嵌套数组: 阅读全文
posted @ 2010-04-04 18:03 万一 阅读 (5683) | 评论 (0) 编辑
学 Win32 汇编[5]: 数据类型与声明
摘要:类型描述类型缩写位数字节数浮点数有效位数值范围字节BYTEDB81 0..255有符号字节SBYTEDB81 -128..127字WORDDW162 0..65535有符号字SWORDDW162 -32768..32767双字DWORDDD324 0..4294967295有符号双字SDWORDDD324 -2147483648..2147483647远字FWORDDF486 四字QWORDDQ6... 阅读全文
posted @ 2010-04-04 16:22 万一 阅读 (3439) | 评论 (0) 编辑
学 Win32 汇编[4]: 使用 Debug 输出测试结果
摘要:由于 Debug 输出是使用的标准的 Win32 窗口, 所以 include 和 includelib 的文件较多.这样建立工程时就不需要是控制台程序了, 工程建立方法:文件 -> 新建工程 -> 工程类型: Win32 App (no res) ...PrintString: 输出字符串变量PrintText: 直接输出字符串PrintStringByAddr: 根据字符串地址输出字符串Pri... 阅读全文
posted @ 2010-04-04 13:55 万一 阅读 (4165) | 评论 (5) 编辑
学 Win32 汇编[3]: 控制台下的几种输出方式
摘要:在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输出显示的手段.我刚开始学习时使用的是控制台输出, 最后发现既然是 Win32 汇编还是用 Debug 输出更好.下面是之前尝试出的控制台输出的几种办法:1、使用 MASM 提供的 StdOut 函数;2、使用系统 API: 3、使用微软 C 标准库 msvcrt.dll 中的 printf 函数.使用 MASM 的 StdOut 函数:使用系统... 阅读全文
posted @ 2010-04-03 14:25 万一 阅读 (9146) | 评论 (1) 编辑
学 Win32 汇编[2]: 最简单的 Win32 程序
摘要:建立过程:1、文件 -> 新建工程 -> 工程类型: Win32 App (no res)、工程名称: Test1 -> 默认下去到完成.2、打开 Test1.asm 输入以上代码, 然后编译执行. 结果如下:程序注释:关于换行: 在实际操作中, 我没有使用换行符号 \ 也可以, 如: 阅读全文
posted @ 2010-04-03 11:05 万一 阅读 (3881) | 评论 (1) 编辑
学 Win32 汇编[1]: 选择编辑与编译工具
摘要:Win32 汇编工具主要有 MASM 和 TASM; 我选择前者, 理由是使用范围广, 便于交流.根据介绍, 我先下载了 MASM32(http://www.masm32.com/), 发现不错, 但不是我最想要的.后来找到了 RadASM(官方地址: http://www.oby.ro/rad_asm/index.html)我最终选择了 cao_cong 做的 RadASM 汉化集成包(http... 阅读全文
posted @ 2010-04-02 22:47 万一 阅读 (4811) | 评论 (3) 编辑
汇编指令速查
摘要:指令功能AAA调整加AAD调整除AAM调整乘AAS调整减ADC进位加ADD加AND与ARPL调整优先级BOUND检查数组BSF位右扫描BSR位左扫描BSWAP交换字节BT位测试BTC位测试求反BTR位测试清零BTS位测试置一CALL过程调用CBW转换字节CDQ转换双字CLC进位清零CLD方向清零CLI中断清零CLTS任务清除CMC进位求反CMOVA高于传送CMOVB低于传送CMOVE相等传送CMO... 阅读全文
posted @ 2010-03-16 22:02 万一 阅读 (48168) | 评论 (2) 编辑
检索用到汇编代码的单元
摘要:结果: 阅读全文
posted @ 2010-03-09 12:09 万一 阅读 (2101) | 评论 (2) 编辑
初学 Delphi 嵌入汇编[30] - 寄存器表
摘要:类型 名称 二进制码 寄存器说明 多功能寄存器 AL 0 累加寄存器低八位 AH 100 累加寄存器低八位 AX 0 16 位累加寄存器 EAX 0 32 位累加寄存器 BL 11 基址寄存器低八位 BH 111 基址寄存器低八位 BX 11 16 位基址寄存器 ... 阅读全文
posted @ 2008-01-31 13:53 万一 阅读 (7852) | 评论 (15) 编辑
初学 Delphi 嵌入汇编[29] - 寄存器所能接受的数值范围
摘要:譬如 EAX AX AH AL 四个储存器, 真实存在的其实只有一个 EAX, AX AH AL 不过是不同的访问方式. 11111111 11111111 11111111 11111111 : EAX 11111111 11111111 11111111 11111111 : AX 11111111 11111111 11111111 11111111 : AH 11111111 111111... 阅读全文
posted @ 2008-01-30 21:01 万一 阅读 (3411) | 评论 (5) 编辑
初学 Delphi 嵌入汇编[28] - 把 EAX 的值置为 0 的三种方法与效率
摘要://以下三个函数功能一样, 但效率不同 {Fun1 需要读取常数 0, 最慢} function Fun1: Integer; asm mov eax, 0 end; {Fun2 与 Fun3 只是操作 CPU 的寄存器, 比 Fun1 快} function Fun2: Integer; asm sub eax, eax end; {Fun3 最快} function Fun3:... 阅读全文
posted @ 2008-01-30 11:18 万一 阅读 (3465) | 评论 (17) 编辑
初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容
摘要://XCHG 指令: 交换寄存器的内容 var x,y: Integer; begin x := 1; y := 9; asm mov eax, x mov ecx, y xchg eax, ecx {xchg 的参数必须至少一个是寄存器, 不能有 xchg x,y 类似的操作} mov x, eax mov y, ecx end; ... 阅读全文
posted @ 2008-01-30 10:14 万一 阅读 (3081) | 评论 (0) 编辑
初学 Delphi 嵌入汇编[26] - 大小写字母转换
摘要://小写字母转大写字母 function Fun1(C: Char): Char; asm sub C, 32 //sub C, 'a'-'A' {竟也可以这样写} end; //大写字母转小写字母 function Fun2(C: Char): Char; asm add C, 32 end; //测试 procedure TForm1.Button1Click(Sende... 阅读全文
posted @ 2008-01-30 00:08 万一 阅读 (4560) | 评论 (4) 编辑
初学 Delphi 嵌入汇编[25] - 在汇编中调用函数
摘要://准备一个在汇编中要调用的函数 function DelphiFun(x,y: Integer): Integer; begin Result := x + y; end; //汇编函数 function AsmFun: Integer; asm mov eax, 1 {eax 对应函数的第一个参数, 这里给第一个参数赋值为 1} mov edx, 2 {e... 阅读全文
posted @ 2008-01-29 21:24 万一 阅读 (3610) | 评论 (5) 编辑
初学 Delphi 嵌入汇编[24] - 汇编语言的简单数据类型
摘要:类型 助记符 助记符简写 所占字节数 数值范围 字节 BYTE DB 1 0..255 字 WORD DW 2 0..65535 双字 DWORD DD 4 0..4294967295 远字 FWORD DF 6 四字 QWORD DQ 8 十字节 TBYTE DT 10 有符号字节 SBYTE 1 -128..127 有符号字 S... 阅读全文
posted @ 2008-01-29 17:26 万一 阅读 (3052) | 评论 (0) 编辑
初学 Delphi 嵌入汇编[23] - LOOP 循环
摘要://计算 x 的 n 次方的函数 function Fun(x,n: Integer): Integer; asm //mov eax, x {因为 eax 会先获取第一个参数, 这句可以省略} mov ecx, n {ecx 是个计数寄存器, 会记录循环的次数, 每循环一次 ecx 的值就会减1} sub ecx, 1 @Lable1... 阅读全文
posted @ 2008-01-29 17:05 万一 阅读 (4209) | 评论 (13) 编辑
初学 Delphi 嵌入汇编[22] - 在汇编代码中使用记录
摘要://自定义记录用于测试 Type TMyRec = record i: Integer; c: Char; end; //在汇编中使用记录的过程 procedure GetRec(Rec: TMyRec); asm mov eax.TMyRec.i, 100 {eax 会接受第一个参数} mov eax.TMyRec.c, 'M' end; //测试 pr... 阅读全文
posted @ 2008-01-29 16:05 万一 阅读 (3034) | 评论 (18) 编辑
初学 Delphi 嵌入汇编[21] - Delphi 的其他整数类型
摘要:除了 Byte、Word、Cardinal、Integer 外, Delphi 的整数类型还有: Longint、Longword、Shortint、Smallint、Int64 其中 Longint 相当于 Integer; Longword 相当于 Cardinal. 这样还有三种类型: Shortint、Smallint、Int64 //Shortint 是1字节(8位)有符号整数 va... 阅读全文
posted @ 2008-01-29 12:49 万一 阅读 (2930) | 评论 (3) 编辑
初学 Delphi 嵌入汇编[20] - Delphi 的 Integer 类型
摘要:var I: Integer; begin //Integer 类型是4字节(32位)有符号整数, 最高位是符号位, 如果是正数, 符号位是 0、负数的符号位是1 //所以 Integer 的最大值是: 01111111 11111111 11111111 111111112 asm mov I, 01111111111111111111111111111111B; ... 阅读全文
posted @ 2008-01-29 11:59 万一 阅读 (5925) | 评论 (3) 编辑
初学 Delphi 嵌入汇编[19] - Delphi 的无符号整数类型
摘要:var B: Byte; W: Word; C: Cardinal; begin {Byte 是1字节(8位)无符号整型, 其最大值是 111111112} asm mov B, 11111111B; end; ShowMessage(IntToStr(B)); {255} {Word 是2字节(16位)无符号整型, 其最大值是 11111111 11... 阅读全文
posted @ 2008-01-29 11:24 万一 阅读 (5270) | 评论 (6) 编辑
初学 Delphi 嵌入汇编[18] - SHL 与 SHR
摘要:汇编中的SHL(左移)、SHR(右移)命令也是和 Delphi 一样的. var ByteNum: Byte; begin //右移 shr asm mov al, 10000000B {128} shr al, 1 {shr 10000000 一次会得到 01000000} mov ByteNum, al end; ShowMessa... 阅读全文
posted @ 2008-01-28 10:51 万一 阅读 (5956) | 评论 (14) 编辑
初学 Delphi 嵌入汇编[17] - 逻辑运算
摘要:AND: 逻辑与指令 OR : 逻辑或指令 XOR: 逻辑异或指令 NOT: 逻辑非指令 这和 Delphi 的逻辑命令完全一致. //逻辑非 Not: { not 1 = 0; not 0 = 1; } var ByteNum: Byte; begin //赋值 11111111B (255) 取反: asm mov al, 11111111B {eax ... 阅读全文
posted @ 2008-01-28 10:04 万一 阅读 (4726) | 评论 (3) 编辑
初学 Delphi 嵌入汇编[16] - 进制的表示方法
摘要:关于进制: 生活中有 7进制(星期)、60进制(小时)、10进制(算术)等等. 计算机要用到 10进制、16进制、2进制和 8进制. 8进制用得少了, 但也有, 譬如 Unix 服务器上的文件属性. 2进制是计算机容易识别的; 10进制是人容易识别的, 据说 10进制源自于人有十个手指. 计算机为什么会使用 8进制和 16进制呢? 因为: 23=8; 24=16; 这样比较容易和 2进制换算... 阅读全文
posted @ 2008-01-25 21:44 万一 阅读 (5322) | 评论 (2) 编辑
初学 Delphi 嵌入汇编[15] - 需要保护的寄存器
摘要:前面提到 32 位的寄存器有: EAX EBX ECX EDX ESP EBP ESI EDI; 其中, EAX ECX EDX 是自由使用的. 那么剩下的 EBX ESP EBP ESI EDI 五个寄存器就是应该保护的! 所谓保护, 并不是不可以使用, 而是在使用前先把其中的值寄存在另外一个地方, 用完后再恢复其值. 如果不这样做, 有可能会发生意想不到的错误. 举例: //使用应该保护... 阅读全文
posted @ 2008-01-25 17:19 万一 阅读 (3121) | 评论 (7) 编辑
初学 Delphi 嵌入汇编[14] - 常量与变量在汇编中的一个区别
摘要://常量可以在汇编语句中运算 function Fun: Integer; const a = 11; b = 5; asm mov eax, a-b end; //测试 procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin i := Fun; ShowMessage(IntToSt... 阅读全文
posted @ 2008-01-25 17:16 万一 阅读 (3219) | 评论 (2) 编辑
初学 Delphi 嵌入汇编[13] - 地址参数用 [] 取值
摘要://关于地址参数(var/out) function Fun(var x,y: Integer): Integer; asm mov eax, x {现在 eax 中只是 x 的地址} mov eax, [eax] { [eax] 是取值, 是不是类似于 P^ ? } mov edx, y add eax, [edx] //mov @Result, e... 阅读全文
posted @ 2008-01-25 09:25 万一 阅读 (3651) | 评论 (5) 编辑
初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result
摘要://在汇编代码中使用 Result function Fun(x: Integer): Integer; asm mov ecx, &x dec ecx {汇编中的 dec 是减 1 指令, 和 Delphi 是一样的} mov @Result, ecx {在本例中去掉 @ 也可以, 暂时不知怎么回事} end; //测试 procedure TForm1.... 阅读全文
posted @ 2008-01-25 00:06 万一 阅读 (3519) | 评论 (11) 编辑
初学 Delphi 嵌入汇编[11] - 用汇编重写一个 Delphi 函数
摘要://Delphi 函数 function DelphiFun(x: Integer): Integer; begin Result := x * 2; end; //汇编函数, 和上面的函数是同样的功能 function AsmFun(x: Integer): Integer; asm add eax, eax {eax 可以获取第一个参数, 同时又是函数的返回值, 所以可以如此简... 阅读全文
posted @ 2008-01-24 23:34 万一 阅读 (3810) | 评论 (1) 编辑
初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器
摘要:返回类型 寄存位置 Char、Byte AL 寄存器 SmallInt、Word AX 寄存器 Integer、LongWord、AnsiString、Pointer、Class EAX 寄存器 Real48 EAX 寄存器中是栈内返回值的指针 Int64 EDX、EAX 寄存器对 Single、Double、Extended、Comp 栈首寄存器 ST(0) ... 阅读全文
posted @ 2008-01-24 20:36 万一 阅读 (4014) | 评论 (1) 编辑
初学 Delphi 嵌入汇编[9] - asm 可以代替 begin
摘要://可以用 asm 代替 begin function Fun(x: Integer): Integer; asm mov eax, x inc eax end; { 汇编中的 inc 指令和 Delphi 中的 inc 是一样的; 本例也同时证明 eax 寄存器确实保存着函数的返回值. } procedure TForm1.Button1Click(Sender: TObje... 阅读全文
posted @ 2008-01-24 20:04 万一 阅读 (5300) | 评论 (5) 编辑
初学 Delphi 嵌入汇编[8] - 8 位寄存器、16 位寄存器与 32 位寄存器
摘要:王爽老师书上说, CPU 内部主要就是寄存器. 现在我们在 32 位的系统下工作, 当然主要使用的是 32 位寄存器; 那它和 8 位、16 位的寄存器又有什么关系呢? 从网上找到一个简洁明了的图片: EAX 是 32 位的, 也就是 4 个字节大小; 它的低两位就是 AX; AX 是 16 位的, 又分 2 个字节; 它的高字节是 AH、低字节是 AL; AH 与 AL 是 8 位的. ... 阅读全文
posted @ 2008-01-24 17:37 万一 阅读 (3853) | 评论 (3) 编辑
初学 Delphi 嵌入汇编[7] - 使用常量
摘要://在汇编中使用常量 var a: Integer; const n = $10; begin asm mov ecx, 10 {使用十进制常数} mov a, ecx end; ShowMessage(IntToStr(a)); {10} asm mov ecx, $10 {使用十六进制常数} ...阅读全文
posted @ 2008-01-24 16:13 万一 阅读 (3608) | 评论 (5) 编辑
初学 Delphi 嵌入汇编[6] - & 操作符
摘要://在汇编中访问 Delphi 的变量可以使用 & 操作符 procedure Proc(str1,str2: string); var s1,s2: string; begin asm mov ecx, &str1 {} mov edx, &str2 mov &s1, ecx {} mov &s2, edx end; ShowMessa... 阅读全文
posted @ 2008-01-24 16:04 万一 阅读 (4193) | 评论 (21) 编辑
初学 Delphi 嵌入汇编[5] - 寄存器在过程与函数中的使用 - 续
摘要://测试寄存器: 如果只有两个参数, 看看 ECX EDX 谁来接受第二个参数 procedure Proc(x,y: Integer); var a,b: Integer; begin asm MOV a,ECX MOV b,EDX end; ShowMessage(IntToStr(a) + #44 + IntToStr(b)); end; //测试 p... 阅读全文
posted @ 2008-01-24 15:38 万一 阅读 (4271) | 评论 (14) 编辑
初学 Delphi 嵌入汇编[4] - 寄存器在过程与函数中的使用
摘要:CPU 提供了诸多寄存器, 但在 Delphi 的过程和函数中, 只有 EAX ECX EDX 三个寄存器可以自由使用; 如果改变了其他寄存器, 在过程和函数结束前要给恢复. 记得前面学习过 Delphi 的过程和函数默认的调用约定是 Register , 前三个参数通过寄存器传递, 其他参数存与栈. 它所指的三个寄存器就应该是 EAX ECX EDX 了. 看资料介绍应该是: EAX 先接受第... 阅读全文
posted @ 2008-01-24 11:50 万一 阅读 (5463) | 评论 (25) 编辑
初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子
摘要:前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了. 譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX; 另外提前来个列表 - Delphi 可以用汇编管理以下寄存器: 32 位寄存器: EAX EBX ECX EDX ESP EBP ESI EDI 16 位寄存器: AX BX CX DX SP BP SI DI ... 阅读全文
posted @ 2008-01-23 18:30 万一 阅读 (7638) | 评论 (17) 编辑
初学 Delphi 嵌入汇编[2] - 汇编语言关键字
摘要:汇编语言不区分大小写. 关键字 用途 AH AL AND AX BH BL BP BX BYTE CH CL CS CX DH DI DL DS DWORD DX EAX EBP EBX ECX EDI EDX EIP ES ES... 阅读全文
posted @ 2008-01-23 14:41 万一 阅读 (6341) | 评论 (8) 编辑
初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
摘要:非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的《汇编语言》. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系列二进制数字, 计算机将之转换为一系列高低电平, 而实现运算. 在 PC 机上运行机器指令的是 CPU; 不同的 CPU 有不同的指令, 所以某种汇编语言也只是针对某系列的 CPU. 王爽老师举了一个用机... 阅读全文
posted @ 2008-01-23 14:22 万一 阅读 (9719) | 评论 (14) 编辑
posted @ 2019-11-18 17:59  襄阳古城  阅读(305)  评论(0编辑  收藏  举报