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

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

 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. CentOS 7 firewalld vsftpd开放端口

    开放FTP端口的方法: 暂时开放 ftp 服务 firewall-cmd --add-service=ftp 1 永久开放 ftp 服务 firewall-cmd --add-service=ftp ...

  2. Azure PowerShell (15) 批量导出Azure ASM/ARM VM信息

    <Windows Azure Platform 系列文章目录> 客户又提出新的需求,需要知道所有订阅下的虚拟机数量.运行情况等信息. 我花了点时间,写了一个PowerShell脚本,发布到 ...

  3. Azure REST API (4) 在Python环境下,使用Azure REST API

    <Windows Azure Platform 系列文章目录> 之前遇到的项目中,客户需要在Python环境下,监控Azure VM的CPU利用率,在这里简单记录一下. 笔者的环境是Win ...

  4. CSS 鼠标选中文字后改变背景色的实现代码

    废话不多说,直接上代码 ::-moz-selection{background:#93C; color:#FCF;} ::selection {background:#93C; color:#FCF; ...

  5. STL基础--迭代器和算法

    1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; ...

  6. C++进阶--隐式类型转换

    //############################################################################ /* 隐式类型转换 * * 类型转换可分为 ...

  7. Ubuntu 14.10 下HBase错误集

    1 如果机群时间不同步,那么启动子节点RegionServer就会出问题 aused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException ...

  8. (转)java基础-反射

    原文地址:https://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的C ...

  9. Python——pandas数据处理(python programming)

  10. php的方法

    字符串: strlen(): 字符串的个数: . : 通过.来进行字符串的拼接: 数组: count(): 数组的 个数: is_array(): 判断是不是一个数组: 实参的方法: func_num ...