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

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

 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. DLL何时需共享内存管理器

    Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem.这样 ...

  2. SVN怎么触发Jenkins自动构建

    通常,有几种方式可以在SVN仓库发生改变时触发Jenkins进行构建.第一种是,Jenkins主动轮询SVN仓库:第二种是,在SVN客户端(如TortoiseSVN)创建客户端hooks来触发构建:第 ...

  3. CAD中的各种Polyline

    序号 类 类名 dxf代码 1 Polyline2d AcDb2dPolyline POLYLINE 2 Polyline3d AcDb3dPolyline POLYLINE 3 Polyline A ...

  4. 安装Python时遇到的api-ms-win-crt-runtime-l1-1-0.dll 丢失问题

    api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示“api- ...

  5. C# 生成时间戳

    编写网络程序中难免用到一些时间戳. 早前不知道哪里复制过一个代码,如下: public static string GetTimeStamp() { TimeSpan ts = DateTime.Ut ...

  6. 关于“最小的K个数”问题

    从一堆无序的数中(共n个数)找到最小的K个数,这也算是一道比较经典的题目了,关于这道题目的解法,一般有几种: 方法1:先对所有的数据进行排序,然后直接找出前K个数来,即最小的K个数.时间复杂度为O(N ...

  7. C# name scheme

    1.For varibale.camel scheme.the first word lowercase the first letter,then other words capitalize th ...

  8. nump库的简单函数介绍

    1:ones函数(百度知道) ones()函数用以创建指定形状和类型的数组,默认情况下返回的类型是float64.但是,如果使用ones()函数时指定了数据类型,那么返回的就是该类型. 参考NumPy ...

  9. uoj#209. 【UER #6】票数统计

    http://uoj.ac/problem/209 当x!=y时,这个限制条件是确定的,可以枚举总通过数,用组合数计算,当x==y时,这个限制条件表示前x个全部通过或后x个全部通过,只有最大的x有用, ...

  10. 原型设计工具——axure认识与使用

    原型设计工具——axure认识与使用 10款原型设计工具推荐 pasting