《汇编语言 基于x86处理器》第十章结构和宏部分的代码
▶ 书中第十章的程序,主要讲了结构与宏的使用
● 代码,使用结构,对比是否对齐的性能差距
INCLUDE Irvine32.inc
INCLUDE macros.inc structN STRUCT ; 非对齐的结构
Lastname BYTE DUP() ;
Years WORD ;
SalaryHistory DWORD , , , ;
structN ENDS ; 48 Byte structA STRUCT ; 对齐的结构
Lastname BYTE DUP() ;
ALIGN WORD ; +2
Years WORD ;
ALIGN DWORD ; +2
SalaryHistory DWORD , , , ;
structA ENDS ; 52 Byte .data
ALIGN DWORD ; 对齐到双字
startTime DWORD ?
empBad structN <>
emp structA <> .code
main PROC
call GetMSeconds
mov startTime, eax
mov ecx, 0FFFFFFFFh
L1:
mov empBad.Years,
mov empBad.SalaryHistory,
loop L1 call GetMSeconds
sub eax, startTime
mWrite "Time without align: "
call WriteDec
call Crlf call GetMSeconds
mov startTime, eax
mov ecx, 0FFFFFFFFh
L2:
mov emp.Years,
mov emp.SalaryHistory,
loop L2 call GetMSeconds ; get starting time
sub eax, startTime
mWrite "Time with align: "
call WriteDec ; display elapsed time
call Crlf call WaitMsg
exit
main ENDP END main
■ 输出结果,反复测试,时间差大概在 70 ms 左右
Time without align:
Time with align:
● 调用 win32 API 显示时间,并放到终端中的指定位置
INCLUDE Irvine32.inc COMMENT !
SmallWin.inc 中关于结构 COORD 和 SYSTEMTIME 的定义
COORD STRUCT
X WORD ?
Y WORD ?
COORD ENDS SYSTEMTIME STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
SYSTEMTIME ENDS
! .data
sysTime SYSTEMTIME <>
XYPos COORD <, >
consoleHandle DWORD ?
colonStr BYTE ":",
TheTimeIs BYTE "The time is ", .code
main PROC
INVOKE GetStdHandle, STD_OUTPUT_HANDLE ; 获取标准输出句柄,返回值在 eax,转入变量 consoleHandle
mov consoleHandle, eax INVOKE SetConsoleCursorPosition, consoleHandle, XYPos ; 设置终端光标位置 INVOKE GetLocalTime, ADDR sysTime ; 获取当前时间 movzx eax, sysTime.wHour ; 小时
call WriteDec
mov edx, offset colonStr ; ":"
call WriteString
movzx eax, sysTime.wMinute ; 分钟
call WriteDec
call WriteString ; ":"
movzx eax, sysTime.wSecond ; 秒
call WriteDec call Crlf
call WaitMsg
exit
main ENDP END main
● 使用宏包装以后的汇编 Wraps.asm,主要展示了 Macros.inc 的作用
INCLUDE Irvine32.inc
INCLUDE Macros.inc .data
array DWORD , , , , , , ,
string1 BYTE DUP(?)
string2 BYTE DUP(?) .code
main PROC
mGotoxy , ; 调整终端光标位置,并输出指定字符串
mWrite <"Macro Program sample:", 0dh, 0ah> mGotoxy ,
mWrite <"Go to Row 5, col 0.", 0dh, 0ah>
call Crlf mWrite "Input string 1: " ; 输入两个字符串,然后一并输出
mReadString string1
call Crlf mWrite "Input string 2:"
mReadString string2
call Crlf mWrite "Output the strings:"
mWriteString string1
mWriteSpace
mWriteString string2
call Crlf mDumpMem OFFSET array, LENGTHOF array, TYPE array ; 输出数组 call waitmsg
exit
main ENDP END main
● 代码,使用 WHILE 伪指令在编译阶段进行计算
INCLUDE Irvine32.inc .data
val1 = ; 先给三个常量,然后再定义成变量
val2 =
val3 = val1 + val2
DWORD val1
DWORD val2
DWORD val3 WHILE val3 LT 00010000h ; 使用 WHILE 在编辑阶段进行展开和计算
val1 = val2
val2 = val3
val3 = val1 + val2
ENDM .code
main PROC
mov eax, val3 ; 结果放进 eax 用于输出
call WriteDec
call crlf
call WaitMsg
exit
main ENDP END main
● 代码,使用 REPEAT 生成单链表
INCLUDE Irvine32.inc ListNode STRUCT ; 链表节点结构
NodeData DWORD ?
NextPtr DWORD ?
ListNode ENDS TotalNodeCount =
NULL =
Counter = .data
LinkedList LABEL PTR ListNode
REPT TotalNodeCount
Counter = Counter +
ListNode <Counter, ($ + Counter * SIZEOF ListNode)> ; 设置 next 指针要计算偏移量
;ListNode <Counter, ($ + SIZEOF ListNode)> ; 没有偏移量,next 指针指向自身,错误
ENDM
ListNode <, > ; 尾节点 .code
main PROC
mov esi, OFFSET LinkedList NextNode: ; 打印链表
mov eax, (ListNode PTR [esi]).NextPtr ; 检测是否是尾节点
cmp eax, NULL ; next 指针为空,说明已经到尾部了
je quit mov eax, (ListNode PTR [esi]).NodeData ; 打印节点保存的值
call WriteDec
call Crlf mov esi, (ListNode PTR [esi]).NextPtr ; 移向下一节点
jmp NextNode quit:
call WaitMsg
exit
main ENDP END main
《汇编语言 基于x86处理器》第十章结构和宏部分的代码的更多相关文章
- 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和
▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...
- 《汇编语言 基于x86处理器》第六章条件处理部分的代码
▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...
- 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...
- 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2
▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...
- 《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2
▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 INCLUDE Irvine32.inc .data outHandle HA ...
- 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码
▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...
- 《汇编语言 基于x86处理器》第十二章浮点数部分的代码
▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...
- 《汇编语言 基于x86处理器》第七章整数运算部分的代码
▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...
- 《汇编语言 基于x86处理器》前五章的小程序
▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...
随机推荐
- [Windows Hook] 屏蔽键盘按键
//该例程为在系统级屏蔽一些系统键.如WIN.TAB.CAP.POWER.SLEEP.HOME等! //屏蔽组合键下面例程不适用!(比如CTRL+ESC需要在钩子函数中用(p.vkCode = VK_ ...
- InfluxDB 常用命令
查表: http://192.168.0.200:8086/query?q=select+*+from+telegraf..cpu http://192.168.0.200:8086/query?q= ...
- Windows Azure Web Site (18) Azure Web App设置MIME
<Windows Azure Platform 系列文章目录> 在笔者之前的文章中,介绍了我们在使用Azure Web App,可以把静态资源保存到Azure Storage中: Wind ...
- Excel连接SSAS提示“传输层中遇到错误”的问题
用Excel连接SSAS,在身份验证时弹出对话框提示“传输层中遇到错误”,后来发现其实就是用户名或密码不对,不知道为何Excel不提示一个明确一点的信息.
- npm yarn安装包
- eclipse 修改 项目的git地址
在项目的隐藏目录.git 文件夹下面 修改config配置文件 [core] symlinks = false repositoryformatversion = 0 filemode = false ...
- 关于Nginx配置性能优化
基本的 (优化过的)配置 将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.在服务器的/etc/nginx目录中找到nginx.conf. 首先,我们将谈论一些全局设置,然 ...
- mysql查询优化之二:查询优化器的局限性
在<mysql查询优化之一:mysql查询优化常用方式>一文中列出了一些优化器常用的优化手段.查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MySQL版本的升级而 ...
- OpenVZ管理
查找内存超过5%,CPU超过10% CPU=${:-} MEM=${:-} for CTID in `vzlist|sed '1d'|awk '{print $1}'` { echo "== ...
- [UE4]实例化材质
在虚幻引擎 4 中,材质实例化用来更改材质的外观,而不会引起成本高昂的材质重新编译. 实例化材质官方文档