《汇编语言 基于x86处理器》第十章结构和宏部分的代码

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

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

 1 INCLUDE Irvine32.inc
 2 INCLUDE macros.inc
 3
 4 structN STRUCT                      ; 非对齐的结构
 5     Lastname BYTE 30 DUP(0)         ; 30
 6     Years    WORD 0                 ;  2
 7     SalaryHistory DWORD 0, 0, 0, 0  ; 16
 8 structN ENDS                        ; 48 Byte
 9
10 structA STRUCT                      ; 对齐的结构
11     Lastname BYTE 30 DUP(0)         ; 30
12     ALIGN    WORD                   ; +2
13     Years    WORD 0                 ;  2
14     ALIGN    DWORD                  ; +2
15     SalaryHistory DWORD 0, 0, 0, 0  ; 16
16 structA ENDS                        ; 52 Byte
17
18 .data
19 ALIGN DWORD                         ; 对齐到双字
20 startTime DWORD ?
21 empBad structN <>
22 emp structA <>
23
24 .code
25 main PROC
26     call    GetMSeconds
27     mov     startTime, eax
28     mov     ecx, 0FFFFFFFFh
29 L1:
30     mov     empBad.Years, 5
31     mov     empBad.SalaryHistory, 35000
32     loop    L1
33
34     call    GetMSeconds
35     sub     eax, startTime
36     mWrite  "Time without align: "
37     call    WriteDec
38     call    Crlf
39
40     call    GetMSeconds
41     mov     startTime, eax
42     mov     ecx, 0FFFFFFFFh
43 L2:
44     mov     emp.Years, 5
45     mov     emp.SalaryHistory, 35000
46     loop    L2
47
48     call    GetMSeconds        ; get starting time
49     sub     eax, startTime
50     mWrite  "Time with align: "
51     call    WriteDec            ; display elapsed time
52     call    Crlf
53
54     call    WaitMsg
55     exit
56 main ENDP
57
58 END main

■ 输出结果,反复测试,时间差大概在 70 ms 左右

Time without align: 6999
Time with align: 6913

● 调用 win32 API 显示时间,并放到终端中的指定位置

 1 INCLUDE Irvine32.inc
 2
 3 COMMENT !
 4 SmallWin.inc 中关于结构 COORD 和 SYSTEMTIME 的定义
 5 COORD STRUCT
 6   X     WORD ?
 7   Y     WORD ?
 8 COORD ENDS
 9
10 SYSTEMTIME STRUCT
11     wYear           WORD ?
12     wMonth          WORD ?
13     wDayOfWeek      WORD ?
14     wDay            WORD ?
15     wHour           WORD ?
16     wMinute         WORD ?
17     wSecond         WORD ?
18     wMilliseconds   WORD ?
19 SYSTEMTIME ENDS
20 !
21
22 .data
23 sysTime SYSTEMTIME <>
24 XYPos   COORD <10, 5>
25 consoleHandle DWORD ?
26 colonStr BYTE ":", 0
27 TheTimeIs BYTE "The time is ", 0
28
29 .code
30 main PROC
31     INVOKE  GetStdHandle, STD_OUTPUT_HANDLE  ; 获取标准输出句柄,返回值在 eax,转入变量 consoleHandle
32     mov     consoleHandle, eax
33
34     INVOKE  SetConsoleCursorPosition,  consoleHandle,  XYPos ; 设置终端光标位置
35
36     INVOKE  GetLocalTime, ADDR sysTime                       ; 获取当前时间
37
38     movzx   eax, sysTime.wHour          ; 小时
39     call    WriteDec
40     mov     edx, offset colonStr        ; ":"
41     call    WriteString
42     movzx   eax, sysTime.wMinute        ; 分钟
43     call    WriteDec
44     call    WriteString                 ; ":"
45     movzx   eax, sysTime.wSecond        ; 秒
46     call    WriteDec
47
48     call    Crlf
49     call    WaitMsg
50     exit
51 main ENDP
52
53 END main

● 使用宏包装以后的汇编 Wraps.asm,主要展示了 Macros.inc 的作用

 1 INCLUDE Irvine32.inc
 2 INCLUDE Macros.inc
 3
 4 .data
 5 array DWORD 1, 2, 3, 4, 5, 6, 7, 8
 6 string1 BYTE 31 DUP(?)
 7 string2  BYTE 31 DUP(?)
 8
 9 .code
10 main PROC
11     mGotoxy 0, 0                                        ; 调整终端光标位置,并输出指定字符串
12     mWrite <"Macro Program sample:", 0dh, 0ah>
13
14     mGotoxy 0, 5
15     mWrite <"Go to Row 5, col 0.", 0dh, 0ah>
16     call Crlf
17
18     mWrite "Input string 1: "                           ; 输入两个字符串,然后一并输出
19     mReadString string1
20     call Crlf
21
22     mWrite "Input string 2:"
23     mReadString string2
24     call Crlf
25
26     mWrite "Output the strings:"
27     mWriteString string1
28     mWriteSpace
29     mWriteString string2
30     call Crlf
31
32     mDumpMem OFFSET array, LENGTHOF array,  TYPE array  ; 输出数组
33
34     call waitmsg
35     exit
36 main ENDP
37
38 END main

原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9648863.html

时间: 2024-10-12 18:11:53

《汇编语言 基于x86处理器》第十章结构和宏部分的代码的相关文章

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

? 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,数组求和的几种优化 1 int arraySum(int array[], int count) ; O0 2 { 3 010716D0 push ebp 4 010716D1 mov ebp,esp 5 010716D3 sub esp,0D8h 6 010716D9 push ebx 7 010716DA push esi 8 010716DB push edi 9 010716DC lea edi,[ebp-0

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

? 书中第九章的程序,主要讲了 ● 代码,Irvine32 中的字符串库函数代码范例 1 INCLUDE Irvine32.inc 2 3 .data 4 str1 BYTE "abcde////", 0 5 str2 BYTE "ABCDE", 0 6 msg0 BYTE "Upper case: ", 0 7 msg1 BYTE "str1 == str2", 0 8 msg2 BYTE "str1 < s

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

? 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 1 INCLUDE Irvine32.inc 2 3 .data 4 outHandle HANDLE ? 5 cellsWritten DWORD ? ; 输出计数(输出参数) 6 xyPos COORD <10,2> ; 输出坐标 7 buffer BYTE 41h,42h,43h,44h,45h,46h,47h,48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,

汇编语言:基于 X86 处理器第三章复习笔记

一:基本语言元素 1:整数常量 整数常量表达式:[{ + / - }] digits [ radix ] 整数常量的表达与进制是分不开的,通常通过在尾部添加字母加以区分: 十六进制 h 十进制   t(一般省略) 八进制   o/q 二进制   b 编码实数 r 注意:以字母开头的十六进制为了与标识符分区,必须在前面加数字 0 2:整形常量表达式 整形常量表达式是指一种算术表达式,由整数常量,算术运算符构成,注意:整形常量表达式的运算结果也必须是一个整数常量,其位数应该在处理器的位数之内 算术表

为基于 x86 的 Android* 游戏选择合适的引擎

摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎. 在选择引擎时,你可以考虑以下几个因素: 成本 - 你计划支出多少费用? 维度 - 你的游戏是二维还是三维? 语言 -

Android研究之为基于 x86 的 Android* 游戏选择合适的引擎详解

摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎.上章研究了英特尔 Android* 开发人员指南上的对等应用详解,在选择引擎时,你可以考虑以下几个因素: 成本 - 你

分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)

分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不用自己操心,比如用VirtualAllocEx等函数,给lpAddress参数NULL系统就会自动找一个地方分配你要的内存空间.如果需要自己管理这个就累了...... 一个分配粒度是64K,这就是为什么Null指针区域和64K进入区域都是 64K的原因,刚好就是一个分配粒度.一个内存页是4K,这就是

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2

基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.计算机中读取数据的时候是从高地址到低地址,存储数据时候相反! 2.主机字节序到网络字节序 基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的.因而对int.uint16.uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺