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

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

 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. Excel技巧--图表添加平均线为指标

    如上图,如果在柱状图有一平均指标线,就能很直观地显示各柱状值是否高于或低于平均值这个指标. 添加方法: (1)为表格制作一个柱状图: 2.对图表点右键,菜单选择“更改图表类型”.对话框如下选择: 3. ...

  2. Azure SQL 数据库仓库Data Warehouse (3) DWU

    <Windows Azure Platform 系列文章目录> 在笔者的上一篇文章中:Azure SQL 数据库仓库Data Warehouse (2) 架构 介绍了SQL DW的工作节点 ...

  3. mysql 事务学习

    1.事务 逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败. 2.事务特性 原子性:强调事务的不可分割.一致性:强调的是事务的执行的前后,数据的完整性要保持一致.隔离性:一个事务 ...

  4. Lucene 4.0 正式版发布,亮点特性中文解读[转]

    http://blog.csdn.net/accesine960/article/details/8066877 2012年10月12日,Lucene 4.0正式发布了(点击这里下载最新版),这个版本 ...

  5. 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值---部分内容可能不确切,待讨论

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值  ...

  6. firefox驱动的下载地址

    https://www.seleniumhq.org/download/

  7. vmware导出为ovf

        鼠标单击要导出的虚拟机à文件-à导出为OVFà开始导出(耗时有点长)   导出过程     导出的文件格式为:     出现此报错请点击重试 虚拟就就导入了 导入后就可以使用了 vmware1 ...

  8. 自定义锁屏图片 win7

    win + R打开运行对话框 输入Regedit 点确定 进入注册表,找到以下项次 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersi ...

  9. B-树和B+树的应用

    1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点,则至少 ...

  10. Java关键字final、static使用总结(转)

    原文链接:Java关键字final, static一些要点 1. final   final类不能被继承,没有子类,final类中的方法默认是final的 final方法不能被子类的方法复盖,但可以被 ...