汇编基础

汇编基础

高级语言接口

大多数程序员不会用汇编语言写大的程序,因为这相当的花费时间。反之,高级语言会隐藏一些细节,开发效率更高。汇编语言广泛用于配置硬件驱动器,以优化程序速度和代码量

通用规范

  • 调用规范(call convention)是指调用过程的底层细节。下面列出需要考虑的细节信息:

    • 调用过程需要保存哪些寄存器
    • 传递参数的方法:用寄存器,用堆栈,共享内存或其他方法
    • 主调程序调用过程时参数传递的顺序
    • 参数传值还是传引用
    • 过程调用后,如何恢复堆栈指针
    • 函数如何向主调程序返回结果
  • 命名规范与外部标识符
    当从其他语言程序中调用汇编过程时,外部标识符必须与命名规范兼容。外部标识符(external identifier)是放在模块目标文件中的名称,链接器使得这些名称能被其他程序模块使用。

  • 段名称
    汇编语言过程与高级语言程序连接时,段名称必须是兼容的。本章使用的简化段指令都与Microsoft C++编译器生成的段名称兼容

  • 内存模式
    主调程序与被调程过程使用的内存模式必须相同

Read more
汇编基础

汇编基础

浮点数处理

浮点数二进制表示

十进制浮点数有三个组成部分:符号,有效数字,阶码。比如:\(-1.23154*10^5\)中,符号位负,有效数字为1.23154,阶码为5(虽然不太正确,有时用术语尾数(mantissa)来代替有效数字(significand))

Read more
汇编基础

汇编基础

MS-Windows编程

Win32 控制台编程

链接库用了这么久了,汇编学了这么多了,HelloWorld还不会写。
本章介绍如何用32位Microsoft Windows API(application programming interface)进行控制台窗口编程。
虽然不建议用汇编语言进行扩展图形应用编程,但不影响我们从底层理解高级语言的GUI编程

背景知识

  • 一个Windows应用程序开始的时候,要吗创建一个控制台窗口,要吗创建一个图形化窗口。这里我们一直使用SUBSYSTEAM:CONSOLE,告诉链接器创建一个基于控制台的应用程序

  • 控制台程序的外观和操作就像MS-DOS窗口一样,控制台有一个输入缓冲区以及一个或多个屏幕缓冲区:

    • 输入缓存区(input buffer)包含一组输入记录(input records),其中每个记录都是一个输入事件的数据。输入事件的例子包括键盘输入,鼠标点击,以及用户调整控制台窗口大小
    • 屏幕缓冲区(screen buffer)是字符与颜色数据的二维数组,他会影响控制台窗口文本的外观
  • 调用Win32 API函数时会使用两类字符集:8位的ASCII/ANSI字符集和16位的Unicode字符集

  • 控制台存在访问级别,用于在简单控制和完全控制直接进行权衡

Read more
汇编基础

汇编基础

结构和宏

结构

结构(structure)是一组逻辑相关变量的模板或模式。结构中的变量被称为字段(fields),程序语句可以把结构作为整体进行访问,也可以访问其中的单个字段。
使用结构包含三个连续的步骤:
1)定义结构
2)声明结构类型的一个或多个变量,称为结构变量(structure variables)
3)编写运行时指令访问结构字段

对齐结构字段

为了获得最好的内存I/O性能,结构成员应按其数据类型进行地址对齐。否则,CPU将会花更多时间访问成员。
使用ALIGN伪指令会试其后的字段或者变量按地址对齐

Read more
汇编实验

汇编实验

对应基础第6篇的部分

新建多模块程序

大型源文件难于管理且汇编速度慢,可以把单个文件拆分为多个子文件,但是对其中任意子文件的修改都需要对整个文件进行整体汇编。更好的方法是把一个程序按照 模块 (module)分割。每个模块可以单独汇编,因此,对一个模块源代码的修改就只需要重新汇编这个模块。链接器将所有汇编好的模块(obj文件)组合为一个可执行文件的速度相当快,链接大量目标模块比汇编同样数量的源代码花费的时间要少的多

Read more