- 浏览: 1190364 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (883)
- Spring (101)
- Swing (1)
- Mysql (21)
- Js (59)
- Jsp (2)
- Hibernate (19)
- Myeclipse (5)
- SqlServer 2000 (2)
- poi (15)
- Java (70)
- SSH (12)
- Html (47)
- Fusion Charts (1)
- C\C++ (2)
- 汇编 (36)
- Jquery (37)
- Struts2 (6)
- Ubuntu (16)
- powerDesinger (4)
- Jboss (3)
- JAX-RS (13)
- JAXB (5)
- JAX-WS (11)
- JMS (4)
- WebSocket (8)
- PHP (16)
- Flash (1)
- maven (3)
- Oracle (8)
- HttpClient (6)
- sqlserver (19)
- svn (5)
- Tomcat (3)
- Jdbc (3)
- EsayUi (11)
- 微信公众平台 (19)
- IIS (2)
- Freemarker (11)
- Comet (1)
- Spring MVC (85)
- JBoss Seam (3)
- 二维码 (9)
- Spring Security (4)
- Ehcache (3)
- Apache Shiro (7)
- jackson (16)
- JPA (8)
- jcaptcha (2)
- RSA (2)
- Ajax (6)
- 跟我学Shiro (0)
- Spring4 (19)
- 跟我学spring3 (0)
- css (32)
- excel (4)
- Filter (3)
- 微信公众帐号开发教程 (0)
- Android (6)
- log4j (6)
- 淘宝接口 (17)
- 支付集成 (3)
- 单点登录 (3)
- Html5 (27)
- 移动平台前端 (3)
- Linux (44)
- FusionCharts (27)
- Json Jackson Xml (5)
- 方培工作室-微信开发 (0)
- Apache与Tomcat与IIS整合 (10)
- Nginx (17)
- webService (2)
- apache (4)
- lucene (3)
- lodop (2)
- Shiro (3)
- zTree (2)
- ireport (12)
- Servlet3.0 (5)
- 前端美工 (19)
- AngularJS (1)
- C#开发微信门户及应用 (0)
- Shell (3)
- bat脚本 (16)
- Bootstrap (26)
- Less (10)
- photoshop (6)
- Redis (6)
- Mongodb (10)
- MyBatis (3)
- 数据结构 (0)
- 读写分离-主从复制 (0)
- JFinal (0)
- 百度地图api (3)
- hadoop-hbase-hive-spark (3)
- WebStorm (2)
- Quartz (5)
- ios (0)
- Mina (8)
- Android Studio (4)
- Ratchet教程 (0)
- 移动端重构系列 (1)
- cubic-bezier贝塞尔曲线CSS3动画工具 (1)
- nginx+tomcat+memcached集群 (0)
- 集群 (0)
- ZooKeeper (3)
- Dubbo (0)
- vpn (0)
- kafka (0)
- JVM垃圾回收机制 (0)
- 微信小程序 (0)
- Lua (0)
- Hystrix (0)
- Vue.js (0)
- mycat (0)
- Openresty (0)
- springBoot (0)
- 新分类 (0)
- guava (0)
- 大数据 (0)
- Sentinel (0)
最新评论
-
JackMacing:
中文怎么解决?
SpringMVC与iReport(JasperReports) 5.6整合开发实例 -
18335864773:
用pageoffice把.可以实现在线的文档操作.直接转pdf ...
转:使用jasperreport动态生成pdf,excel,html -
linhao0907:
推荐一款轻量开源的支付宝组件:https://github.c ...
关于Alipay支付宝接口(Java版) -
songronghu:
太好了,非常有用,谢谢分享~
Java ConcurrentModificationException 异常分析与解决方案 -
wzwahl36:
http://www.atool.org/json2javab ...
Java下利用Jackson进行JSON解析和序列化
这是以前的一个求和函数的例子
; Test32_1.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code sum proc v1:dword, v2:dword, v3:dword mov eax, v1 add eax, v2 add eax, v3 ret sum endp ; main proc invoke sum, 11, 22, 33 PrintDec eax; 66 ret main endp end main
把上面的例子改为用寄存器传递参数:
; Test32_2.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code sum proc add eax, ecx add eax, edx ret sum endp ; main proc mov eax, 11 mov ecx, 22 mov edx, 33 invoke sum PrintDec eax; 66 ret main endp end main
如果调用的函数在之后实现, 须用 PROTO 提前声明:
; Test32_3.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib ;sum proto v1:dword, v2:dword, v3:dword sum proto :dword, :dword, :dword ;函数声明的主要是参数类型, 一般省略参数名 .code main proc invoke sum, 11, 22, 33 ;现在调用的是之后的函数 PrintDec eax; 66 ret main endp ; sum proc v1, v2, v3 mov eax, v1 add eax, v2 add eax, v3 ret sum endp end main
测试 StdCall 模式下的参数压栈顺序:
子程序可以指定语言模式(StaCall、C、SysCall、Basic、Fortran、Pascal);
如果不指定则默认使用在 .model 中指定的语言模式.
StaCall、C、SysCall 是从右到左压栈参数;
Basic、Fortran、Pascal 是从左到右压栈参数.
; Test32_4.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code sum proc stdcall v1, v2, v3 ;查看参数压栈顺序(StdCall 是从右到左 push) mov edx, [ebp+16] PrintHex edx ;33 mov edx, [ebp+12] PrintHex edx ;22 mov edx, [ebp+8] PrintHex edx ;11 PrintLine ;下面求和代码 mov eax, v1 add eax, v2 add eax, v3 ret sum endp ; main proc invoke sum, 11h, 22h, 33h PrintDec eax; 66 ret main endp end main
测试 Pascal 模式下的参数压栈顺序:
这是和上面的对比练习, 它们的压栈参数的顺序是反的.
其中的 EBX+8 是最后压栈参数(DWORD)的地址, 同样 EBX 向上偏移 12、16 就分别是另外两个参数的地址.
地址 EBX+4 是 RET 将要返回的地址.
为什么参数不是在 EBX 的下偏移? 因为是先压栈参数在调用函数.
; Test32_5.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code sum proc pascal v1, v2, v3 ;查看参数压栈顺序(pascal 是从左到右 push) mov edx, [ebp+16] PrintHex edx ;11 mov edx, [ebp+12] PrintHex edx ;22 mov edx, [ebp+8] PrintHex edx ;33 PrintLine ;下面求和代码 mov eax, v1 add eax, v2 add eax, v3 ret sum endp ; main proc invoke sum, 11h, 22h, 33h PrintDec eax; 66 ret main endp end main
如果用 Call 代替 invoke 能更好地理解压参顺序:
; Test32_6.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code ViewParam proc C v1, v2, v3 ;把这里的 C 换为 pascal 会有完全不同的结果 PrintDec v1 ;11 PrintDec v2 ;22 PrintDec v3 ;33 ret ViewParam endp ; main proc push 33 push 22 push 11 call ViewParam leave ;leave 是上面几个 push 的反操作, 省了不少 pop ret main endp end main
子过程使用 uses 保护寄存器:
所谓保护就是在子过程执行前先压栈, 执行后在出栈.
; Test32_7.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data dwVal dd ? .code sum proc stdcall uses eax ecx edx, v1, v2, v3 ;这其中的 stdcall 可省略 mov eax, v1 mov ecx, v2 mov edx, v3 add eax, ecx add eax, edx mov dwVal, eax ret sum endp ; main proc ;sum 对这三个寄存器进行的保护, 先给些测试值 mov eax, 7 mov ecx, 8 mov edx, 9 invoke sum, 11, 22, 33 PrintDec dwVal ;66 PrintDec eax ;7 PrintDec ecx ;8 PrintDec edx ;9 ret main endp end main
使用 uses 不如使用 pushad 和 popad 来得简洁:
; Test32_8.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data dwVal dd ? .code sum proc v1, v2, v3 pushad mov eax, v1 mov ecx, v2 mov edx, v3 add eax, ecx add eax, edx mov dwVal, eax popad ret sum endp ; main proc mov eax, 7 mov ecx, 8 mov edx, 9 invoke sum, 11, 22, 33 PrintDec dwVal ;66 PrintDec eax ;7 PrintDec ecx ;8 PrintDec edx ;9 ret main endp end main
和子程序密切相关的有两个指令: call 和 ret
call 相当于 push+jmp;
ret 相当于 pop+jmp;
有些 ret 后面还有个数字, 如 ret 8, 这相当于 ret 后再 esp+8(这是清理 8 字节的堆栈).
另外程序可以同 public 和 private 指定是否能跨模块使用, 默认是 public, 极少用到 private.
声明其他模块成员的 extrn、extern、public 关键字, 现在用 proto 都可以代替了.
该学模块化编程了.
发表评论
-
学 Win32 汇编[34] - 宏汇编(1)
2011-12-22 13:25 727从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也 ... -
学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
2011-12-22 13:23 550我觉得所谓的模块化有两种: "假模块化" ... -
学 Win32 汇编[31] - 结构与联合
2011-12-20 09:48 514结构和联合分别用 struct、union 定义, 都是 en ... -
学 Win32 汇编[30] - 条件及循环伪指令: .IF、.WHILE、.REPEAT 等
2011-12-20 09:48 2077.IF、.ELSEIF、.ELSE、.ENDIF: 条件伪指令 ... -
学 Win32 汇编[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等
2011-12-20 09:47 1875这里的 "串" 并不单指字符串, 包括所有 ... -
学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
2011-12-20 09:46 1404跳转指令分三类:一、无条件跳转: JMP;二、根据 CX、EC ... -
学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
2011-12-19 09:03 1335MUL: 无符号乘 ;影响 OF、CF 标志位 ;指 ... -
学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP
2011-12-19 09:02 1392;INC(Increment): 加一;DEC(Decreme ... -
学 Win32 汇编[25] - 符号扩展指令: CBW、CWDE、CDQ、CWD
2011-12-19 09:01 1559CBW、CWDE、CDQ、CWD: 扩展指令 ;CBW ... -
学 Win32 汇编[24] - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD
2011-12-19 09:01 1383SHL、SHR、SAL、SAR: 移位指令 ;SHL( ... -
学 Win32 汇编[23] - 位测试与位扫描指令: BT、BTC、BTR、BTS、BSF、BSR
2011-12-19 09:00 2089BT、BTS、BTR、BTC: 位测试指令 ;BT(B ... -
学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
2011-12-14 13:23 1237AND: 逻辑与 ;该指令会置 CF=OF=0; 其结 ... -
学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX
2011-12-14 13:22 1047汇编指令的一般性要求: 1、两个操作数的尺寸必须一致; 2、操 ... -
学 Win32 汇编[20]: 洞察标志寄存器
2011-12-14 13:21 61115 14 13 12 11 10 9 8 7 6 ... -
学 Win32 汇编[19]: 查看二进制等相关函数
2011-12-14 13:20 546在 masm32.inc 中有这样几个函数的声明: by ... -
学 Win32 汇编[18]: 关于压栈(PUSH)与出栈(POP) 之二
2011-12-13 14:28 963由于 "栈" 是由高到低使用的, 所以新压 ... -
学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
2011-12-13 14:27 1016记得刚学多线程的时候, 碰到一个结构: //Delphi ... -
学 Win32 汇编[16]: 常用寄存器的常规功能
2011-12-13 14:26 725通用寄存器 EAX ... -
学 Win32 汇编[15]: LOOP 与标号
2011-12-13 14:25 782Loop 是反复执行;从哪反复? 这要用到 "标号& ... -
学 Win32 汇编[14]: 使用中括号 []
2011-12-12 13:24 705[地址] 是取地址指向的内容: ; Test14_1.as ...
相关推荐
win32汇编多文件程序设计 亲测正确版-win32汇编贪吃蛇源码-win22汇编游戏源码 网络流传的很多没法使用,亲测让大家放心使用 汇编语言实现动态链表 以对话框做窗口模板并做为主界面 开发工具 ollydbg + MASM32 +...
第五次汇编语言实验报告-子程序设计.docx第五次汇编语言实验报告-子程序设计.docx第五次汇编语言实验报告-子程序设计.docx第五次汇编语言实验报告-子程序设计.docx第五次汇编语言实验报告-子程序设计.docx第五次汇编...
Win32汇编语言-罗云彬.chm Win32汇编语言-罗云彬.chm Win32汇编语言-罗云彬.chm
WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编
Win32应用程序虽然和其他32位应用程序(例如32位保护模式DOS程序)一样可以使用386汇编语言和保护模式编程,但是Win32应用程序的执行机制与其他32位应用程序有一定的差别,例如消息循环、动态链接等,Win32汇编语言...
汇编实验五--子程序设计
汇编语言下的windows窗口代码,学生管理系统
win32汇编教程。汇编基础。 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:...
Win32汇编编程系列 声明: 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:...
Win32汇编 Win32汇编 Win32汇编 Win32汇编
win32asm汇编语言-罗云彬.chm 学习32位汇编必备、、、、 经典教材 、、、不解释、、、
win32汇编语言入门win32汇编语言入门win32汇编语言入门win32汇编语言入门win32汇编语言入门win32汇编语言入门
很好的汇编教程…… ...-Iczelion的win32汇编教程 -Iczelion的ODBC教程 -Iczelion的VxD教程 -Iczelion的PE教程 -罗云彬的win32汇编教程 -win32ASM经验点滴 -X86汇编语言编程 -加密解密 -病毒的分析和防治
”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过60多个实例逐渐深入Win32汇编语言的方方面面。本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛...
汇编课程设计-键盘程序程序设计 16/32位微机原理
Win32汇编语言程序设计(罗云彬) 学win32汇编的神器 chm格式非常方便
罗云彬的win32汇编语言程序设计 对于了解windows操作系统 很有帮助
从Dos到Win32汇编从Dos到Win32汇编从Dos到Win32汇编从Dos到Win32汇编
”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过60多个实例逐渐深入Win32汇编语言的方方面面。本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛...