▶ 书中第十章的程序,主要讲了结构与宏的使用

● 代码,使用结构,对比是否对齐的性能差距

 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处理器》第十章结构和宏部分的代码的更多相关文章

  1. 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和

    ▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...

  2. 《汇编语言 基于x86处理器》第六章条件处理部分的代码

    ▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...

  3. 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序

    ▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...

  4. 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2

    ▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...

  5. 《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2

    ▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 INCLUDE Irvine32.inc .data outHandle HA ...

  6. 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

    ▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...

  7. 《汇编语言 基于x86处理器》第十二章浮点数部分的代码

    ▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...

  8. 《汇编语言 基于x86处理器》第七章整数运算部分的代码

    ▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...

  9. 《汇编语言 基于x86处理器》前五章的小程序

    ▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...

随机推荐

  1. [Windows Hook] 屏蔽键盘按键

    //该例程为在系统级屏蔽一些系统键.如WIN.TAB.CAP.POWER.SLEEP.HOME等! //屏蔽组合键下面例程不适用!(比如CTRL+ESC需要在钩子函数中用(p.vkCode = VK_ ...

  2. InfluxDB 常用命令

    查表: http://192.168.0.200:8086/query?q=select+*+from+telegraf..cpu http://192.168.0.200:8086/query?q= ...

  3. Windows Azure Web Site (18) Azure Web App设置MIME

    <Windows Azure Platform 系列文章目录> 在笔者之前的文章中,介绍了我们在使用Azure Web App,可以把静态资源保存到Azure Storage中: Wind ...

  4. Excel连接SSAS提示“传输层中遇到错误”的问题

    用Excel连接SSAS,在身份验证时弹出对话框提示“传输层中遇到错误”,后来发现其实就是用户名或密码不对,不知道为何Excel不提示一个明确一点的信息.

  5. npm yarn安装包

  6. eclipse 修改 项目的git地址

    在项目的隐藏目录.git 文件夹下面 修改config配置文件 [core] symlinks = false repositoryformatversion = 0 filemode = false ...

  7. 关于Nginx配置性能优化

    基本的 (优化过的)配置 将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.在服务器的/etc/nginx目录中找到nginx.conf. 首先,我们将谈论一些全局设置,然 ...

  8. mysql查询优化之二:查询优化器的局限性

    在<mysql查询优化之一:mysql查询优化常用方式>一文中列出了一些优化器常用的优化手段.查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MySQL版本的升级而 ...

  9. OpenVZ管理

    查找内存超过5%,CPU超过10% CPU=${:-} MEM=${:-} for CTID in `vzlist|sed '1d'|awk '{print $1}'` { echo "== ...

  10. [UE4]实例化材质

    在虚幻引擎 4 中,材质实例化用来更改材质的外观,而不会引起成本高昂的材质重新编译. 实例化材质官方文档