编译器汇编指定用指令
❶ 如何在各个版本的VC及64位下使用CPUID指令
、推荐使用__cpuid、__cpuidex等Intrinsics函数
32位模式我使用内嵌汇编调用cpuid指令64位模式VC编译器支持内嵌汇编
于微软提供Intrinsics函数——编译器Intrinsics函数编译应机器指令且同支持32位64位
例CPUID指令应Intrinsics函数——
[cpp] view plain
//
void __cpuid(
int CPUInfo[4],
int InfoType
);
void __cpuidex(
int CPUInfo[4],
int InfoType,
int ECXValue
);
__cpuidex函数InfoType参数CPUID指令eax参数即功能IDECXValue参数CPUID指亩备消令ecx参数即功能IDCPUInfo参数用于接收输eax, ebx, ecx, edx四寄存器
早期CPUID功能需要功能ID参数(eax)使用__cpuid函数
CPUID功能越越强功能ID参数(eax)参数够用于加功能ID(ecx)参数应该采用__cpuidex
二、用条件编译判断VC编译器Intrinsics函数支持性(_MSC_VER)
__cpuid、__cpuidex等Intrinsics函数遇问题——
1.低版本VC编译器没intrin.h文件【注】:VC2005(或更高)才拥intrin.h支持__cpuid
2.低版本VC编译器支持__cpuidex【注】:VC2008部版本及VS2011(或更高)intrin.h才__cpuidex
使用条件编译判断VC编译器版本
_MSC_VER微软C/C++编译器——cl.exe编译代码预定义宏值表示cl版本类型int例——
#if _MSC_VER >=1200 // VC++6.0
#if _MSC_VER >=1300 // VC2003
#if _MSC_VER >=1400 // VC2005
#if _MSC_VER >=1500 // VC2008
#if _MSC_VER >滚闹=1600 // VC2011
例发现_MSC_VER于等于1400我#include 再利用_MSC_VER进步判断__cpuid、__cpuidex支持性
三、用条件编译判断64位模式(_WIN64)
使用_WIN64预处理宏用判断目标平台64位
虽编译x64平台程序编译器自推导_WIN64Visual Studio语高亮清楚些能仍按32位代码做语高亮所建议手项目预处理宏增加_WIN64
四、32位用内嵌汇编实现__cpuidex函数
32位模式我使用内嵌汇编实现__cpuidex函数代码——
[cpp] view plain
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 读取参数寄存器
mov edi, CPUInfo; /迅知/ 准备用edi寻址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 寄存器保存CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
五、全部代码
全部代码——
[cpp] view plain
#include
#include
#include
#if _MSC_VER >=1400 // VC2005才支持intrin.h
#include // 所Intrinsics函数
#endif
char szBuf[64];
INT32 dwBuf[4];
#if defined(_WIN64)
// 64位支持内联汇编. 应使用__cpuid、__cpuidex等Intrinsics函数
#else
#if _MSC_VER < 1600 // VS2011. 据说VC2008 SP1才支持__cpuidex
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 读取参数寄存器
mov edi, CPUInfo; // 准备用edi寻址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 寄存器保存CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
#endif // #if _MSC_VER < 1600 // VS2011. 据说VC2008 SP1才支持__cpuidex
#if _MSC_VER < 1400 // VC2005才支持__cpuid
void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
{
__cpuidex(CPUInfo, InfoType, 0);
}
#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid
#endif // #if defined(_WIN64)
// 取CPU厂商(Vendor)
//
// result: 功返字符串度(般12)失败返0
// pvendor: 接收厂商信息字符串缓冲区至少13字节
int cpu_getvendor(char* pvendor)
{
INT32 dwBuf[4];
if (NULL==pvendor) return 0;
// Function 0: Vendor-ID and Largest Standard Function
__cpuid(dwBuf, 0);
// save. 保存pvendor
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四字符
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 间四字符
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 四字符
pvendor[12] = '\0';
return 12;
}
// 取CPU商标(Brand)
//
// result: 功返字符串度(般48)失败返0
// pbrand: 接收商标信息字符串缓冲区至少49字节
int cpu_getbrand(char* pbrand)
{
INT32 dwBuf[4];
if (NULL==pbrand) return 0;
// Function 0x80000000: Largest Extended Function Number
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004) return 0;
// Function 80000002h,80000003h,80000004h: Processor Brand String
__cpuid((INT32*)&pbrand[0], 0x80000002); // 前16字符
__cpuid((INT32*)&pbrand[16], 0x80000003); // 间16字符
__cpuid((INT32*)&pbrand[32], 0x80000004); // 16字符
pbrand[48] = '\0';
return 48;
}
int _tmain(int argc, _TCHAR* argv[])
{
//__cpuidex(dwBuf, 0,0);
//__cpuid(dwBuf, 0);
//printf("%.8X\t%.8X\t%.8X\t%.8X\n", dwBuf[0],dwBuf[1],dwBuf[2],dwBuf[3]);
cpu_getvendor(szBuf);
printf("CPU Vendor:\t%s\n", szBuf);
cpu_getbrand(szBuf);
printf("CPU Name:\t%s\n", szBuf);
return 0;
}
六、兼容性说明
VC编译器32/64位支持性——
32位:VC6早支持编译32位Intrinsics函数
64位:VC2005早支持编译64位Intrinsics函数
本文32位编译器兼容性——
__cpuid:兼容VC6(或更高)
__cpuidex:兼容VC6(或更高)
本文64位编译器兼容性——
__cpuid:兼容VC2005(或更高)
__cpuidex:兼容VC2011(或更高)
❷ 编译器如何将编程语言翻译成目标CPU的特定指令集
编译器如何将编程语言翻译成目标CPU的特定指令集?
MSIL
MSIL是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成Microsoft 中间语言 (MSIL),它是一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段msil代码可以被不同的编译器实时编译并运行在不同的结构上。从理论上来说,MSIL将消除多年以来业界中不同语言之间的纷争。在.NET的世界中可能出现下面的情况一部分代码可以用EFFIL实现,另一部分代码使用C#或VB.NET完成的,但是最后这些代码都将被转换为中间语言。
❸ 汇编语言(面向机器的程式设计语言)详细资料大全
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可程式器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或运算元的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
许多汇编程式为程式开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
汇编语言不像其他大多数的程式设计语言一样被广泛用于程式设计。在今天的实际套用中,它通常被套用在底层,硬体操作和高要求的程式最佳化的场合。驱动程式、嵌入式作业系统和实时运行程式都需要汇编语言。
基本介绍 中文名 :汇编语言 外文名 :Assembly Language 学科 :软体工程 产生年代 :20世纪50年代 编译方式 :汇编 发展历程,语言特点,总体特点,优点,缺点,语言组成,数据传送指令,整数和逻辑运算指令,移位指令,位操作指令,条件设定指令,控制转移指令,串操作指令,输入输出指令,相关技术,汇编器,编译环境,发展前景,实际套用,经典教材,x86处理器,ARM及单片机, 发展历程 说到汇编语言的产生,首先要讲一下机器语言。机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。 上面所说的计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。在我们常用的PC机中,有一个晶片来完成上面所说的计算机的功能。这个晶片就是我们常说的CPU(Central Processing Unit,中央处理单元)。每一种微处理器,由于硬体设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。 早期的程式设计均使用机器语言。程式设计师们将用0, 1数字编成的程式代码打在纸带或卡片上,1打孔,0不打孔,再将程式通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。程式设计师们很快就发现了使用机器语言带来的麻烦,它们难于辨别和记忆,给整个产业的发展带来了障碍,于是汇编语言产生了。 汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。 操作:暂存器BX的内容送到AX中1000100111011000机器指令movax,bx汇编指令 此后,程式设计师们就用汇编指令编写源程式。可是,计算机能读懂的只有机器指令,那么如何让计算机执行程式设计师用汇编指令编写的程式呢?这时,就需要有一个能够将汇编指令转换成机器指令的翻译程式,这样的程式我们称其为编译器。程式设计师用汇编语言写出源程式,再用汇编编译器将其编译为机器码,由计算机最终执行。 工作过程 语言特点 汇编语言是直接面向处理器(Processor)的程式设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。 汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是暂存器或者存储器,也就是说它是直接和暂存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在暂存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的暂存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程式设计师自己来完成的,这无异增加了编程的复杂程度,降低了程式的可读性。 再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程式与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程式有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程式是无法移植的,也就是说,汇编语言程式的通用性和可移植性要比高级语言程式低。 正因为汇编语言有“与机器相关性”的特性,程式设计师用汇编语言编写程式时,可充分对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态。这样编写出来的程式执行代码短、执行速度快。汇编语言是各种程式语言中与硬体关系最密切、最直接的一种,在时间和空间的效率上也最高的一种,它是高等院校计算机套用技术必修的专业课程之一,对于训练学生掌握程式设计技术,熟悉上机操作和程式调试技术有重要作用 总体特点 1.机器相关性 这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程式。 2.高速度和高效率 汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬体设备,如磁盘、存储器、CPU、I/O连线端口等,且占用记忆体少,执行速度快,是高效的程式设计语言。 3.编写和调试的复杂性 由于是直接控制硬体,且简单的任务也需要很多汇编语言语句,因此在进行程式设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬体资源。这样,就不可避免地加重了程式设计师的负担。与此相同,在程式调试时,一旦程式的运行出了问题,就很难发现。 优点 1、因为用汇编语言设计的程式最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬体设备,如磁盘、存储器、CPU、I/O连线端口等。使用汇编语言,可以访问所有能够被访问的软、硬体资源。 2、目标代码简短,占用记忆体少,执行速度快,是高效的程式设计语言,经常与高级语言配合使用,以改善程式的执行速度和效率,弥补高级语言在硬体控制方面的不足,套用十分广泛。 缺点 1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语言语法和编译器,编译的程式无法在不同的处理器上执行,缺乏可移植性; 2、难于从汇编语言代码上理解程式设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试; 3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行最佳化,开发效率很低,周期长且单调。 语言组成 数据传送指令 这部分指令包括通用数据传送指令MOV、条件传送指令CMOV 、堆叠操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOV不是一条具体的指令,而是一个指令簇,包括大量的指令,用于根据EFLAGS暂存器的某些位状态来决定是否执行指定的传送操作。 整数和逻辑运算指令 这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。 移位指令 这部分指令用于将暂存器或记忆体运算元移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。 位操作指令 这部分指令包括位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。 条件设定指令 这不是一条具体的指令,而是一个指令簇,包括大约30条指令,用于根据EFLAGS暂存器的某些位状态来设定一个8位的暂存器或者记忆体运算元。比如SETE/SETNE/SETGE等等。 控制转移指令 这部分包括无条件转移指令JMP、条件转移指令J /JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。注意,J 是一个指令簇,包含了很多指令,用于根据EFLAGS暂存器的某些位状态来决定是否转移;INT n是软中断指令,n可以是0到255之间的数,用于指示中断向量号。 串操作指令 这部分指令用于对数据串进行操作,包括串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串载入指令LODS、串保存指令STOS,这些指令可以有选择地使用REP/REPE/REPZ/REPNE和REPNZ的前缀以连续操作。 输入输出指令 这部分指令用于同外围设备交换数据,包括连线端口输入指令IN/INS、连线端口输出指令OUT/OUTS。 高级语言辅助指令 这部分指令为高级语言的编译器提供方便,包括创建栈帧的指令ENTER和释放栈帧的指令LEAVE。 控制和特权指令 这部分包括无操作指令NOP、停机指令HLT、等待指令WAIT/MWAIT、换码指令ESC、汇流排封锁指令LOCK、记忆体范围检查指令BOUND、全局描述符表操作指令LGDT/SGDT、中断描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值载入指令LSR、描述符访问权读取指令LAR、任务暂存器操作指令LTR/STR、请求特权级调整指令ARPL、任务切换标志清零指令CLTS、控制暂存器和调试暂存器数据传送指令MOV、高速快取控制指令INVD/WBINVD/INVLPG、型号相关暂存器读取和写入指令RDMSR/WRMSR、处理器信息获取指令CPUID、时间戳读取指令RDTSC等。 浮点和多媒体指令 这部分指令用于加速浮点数据的运算,以及用于加速多媒体数据处理的单指令多数据(SIMD及其扩展SSEx)指令。这部分指令数据非常庞大,无法一一列举,请自行参考INTEL手册。 虚拟机扩展指令 这部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。 相关技术 汇编器 典型的现代 汇编器 (assembler)建造目标代码,由解译组语指令集的易记码(mnemonics)到操作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体。使用符号参考是汇编器的一个重要特征,它可以节省修改程式后人工转址的乏味耗时计算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码。 编译环境 用汇编语言等非机器语言书写好的符号程式称为源程式,汇编语言编译器的作用是将源程式翻译成目标程式。目标程式是机器语言程式,当它被安置在记忆体的预定位置上后,就能被计算机的CPU处理和执行。 汇编的调试环境总的来说比较少,也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说,功能良好的编译器用起来应当非常方便,比如,应当可以自动整理格式、语法高亮显示,集编译、连结和调试为一体,方便实用。 对于广泛使用的个人计算机来说,可以自由选择的汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具备调试功能。如果是为了学习汇编语言,轻松汇编因为拥有一个完善的集成环境,是一款非常适合初学者的汇编编译器。 发展前景 汇编语言是机器语言的助记符,相对于比枯燥的机器代码易于读写、易于调试和修改,同时优秀的汇编语言设计者经过巧妙的设计,使得汇编语言汇编后的代码比高级语言执行速度更快,占记忆体空间少等优点,但汇编语言的运行速度和空间占用是针对高级语言并且需要巧妙设计,而且部分高级语言在编译后代码执行效率同样很高,所以此优点慢慢弱化。而且在编写复杂程式时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。常说汇编语言是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是计算机(或微机)底层设计程式设计师必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。只是,现在计算机最大的领域为IT软体,也是我们常说的计算机套用软体编程,在熟练的程式设计师手里,使用汇编语言编写的程式,运行效率与性能比其它语言写的程式相对提高,但是代价是需要更长的时间来最佳化,如果对计算机原理及编程基础不扎实,反而增加其开发难度,实在是得不偿失,对比2010年前后的软体开发,已经是市场化的软体行业,加上高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。 但是,迄今为止,还没有程式设计师敢断定汇编语言是不需要学的,同时,汇编语言(Assembly Language)是面向机器的程式设计语言,设计精湛的汇编程式设计师,部分已经脱离软体开发,挤身于工业电子编程中。对于功能相对小巧但硬体对语言设计要求苛刻的行业,如4位单片机,由于其容量及运算,此行业的电子工程师一般负责从开发设计电路及软体控制,主要开发语言就是汇编,c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程式设计师的十倍以上。这种情况是因为21世纪以来,学习汇编的人虽然也不少,但是真正能学到精通的却不多,它相对于高级语言难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。对于一个全面了解微机原理的程式设计师,汇编语言是必修语言。 实际套用 随着现代软体系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程式设计师在开发过程中能够更简单,更有效率,使软体开发人员得以应付快速的软体开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬体进行操作,生成的程式与其他的语言相比具有更高的运行速度,占用更小的记忆体,因此在一些对于时效性要求很高的程式、许多大型程式的核心模组以及工业控制方面大量套用。 此外,虽然有众多程式语言可供选择,但汇编依然是各大学计算机科学类专业学生的必修课,以让学生深入了解计算机的运行原理。 历史上,汇编语言曾经是非常流行的程式设计语言之一。随着软体规模的增长,以及随之而来的对软体开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿Linux核心来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬体的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬体的性能。 首先,汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时回响的场合比较有用,比如仪器仪表和工业控制设备中。 其次,在系统程式的核心部分,以及与系统硬体频繁打交道的部分,可以使用汇编语言。比如作业系统的核心程式段、I/O接口电路的初始化程式、外部设备的低层驱动程式,以及频繁调用的子程式、动态连线库、某些高级绘图程式、视频游戏程式等等。 再次,汇编语言可以用于软体的加密和解密、计算机病毒的分析和防治,以及程式的调试和错误分析等各个方面。 最后,通过学习汇编语言,能够加深对计算机原理和作业系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软体系统的原理,打下技术理论基础;向下为掌握硬体系统的原理,打下实践套用基础。 经典教材 汇编语言教材很多,各种处理器都有涉及,粗略统计不下百种。在这么多的教材里,用得较多的可以分类列举如下: x86处理器 1.《x86汇编语言:从实模式到保护模式》,李忠着,电子工业出版社,2013-1 。 基于INTEL x86处理器、NASM编译器和BOCHS虚拟机。汇编语言就是处理器的语言,从这个意义上来说,既然学习汇编语言,就必须直接面向硬体编程,而不是使用莫名其妙的DOS中断和API调用。这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬体,在不借助于BIOS、DOS、Windows、Linux或者任何其他软体支持的情况下来显示字符、读取硬盘数据、控制其他硬体等。 我们知道,32位和64位是主流,实模式和DOS作业系统已经成为历史,Linux和Windows都工作在保护模式下。这本书从实模式讲到32位保护模式,尤其以32位保护模式为重点,阅读本书,对理解现代计算机和现代作业系统的工作原理有非常大的帮助作用。 2.《汇编语言》(第2版),王爽着,清华大学出版社,2013-4-1 基于INTEL 8086处理器、MASM编译器,以及DOS平台的汇编教材,完全以8086处理器的实模式为主,不涉及常用的32位和64位模式,但因为通俗易懂,读者反映很好。 3.《80X86汇编语言程式设计教程》,杨季文等 编着,清华大学出版社,1999-3-1 基于INTEL x86处理器、MASM和TASM编译器,包含16位实模式和32位保护模式的内容,而且对后者讲述较为详细。 4.《32位汇编语言程式设计》,钱晓捷编着,机械工业出版社,2011-8-1 基于INTEL x86处理器、MASM编译器,以及WINDOWS平台的汇编教材。 5.《16/32位微机原理汇编语言及接口技术》,钱晓捷,陈涛编着,机械工业出版社,2005-2-1 基于INTEL x86处理器,论述16位微型计算机的基本原理、汇编语言和接口技术,并引出32位微机系统相关技术。 6.《Intel汇编语言程式设计》(第五版),(美)欧文着,电子工业出版社,2012-7-1 基于INTEL x86处理器、MASM编译器,以及DOS/WINDOWS平台的汇编教材,既有16位实模式的内容,也有32位保护模式的内容。 7.《汇编语言的编程艺术》(第2版),(美)海德着,清华大学出版社,2011-12-1 基于INTEL x86处理器,使用了作者自制的高级语言汇编器(High Level Assembler,HLA)作为教学工具,以部分地获得高级语言的优势和功能。 8.《x86 PC汇编语言、设计与接口》(第五版),(美)马兹迪,考西着,电子工业出版社,2011-1-1 基于INTEL x86处理器,既讲了16位实模式的内容,也讲了32位保护模式的内容,对64位也有所介绍。 ARM及单片机 1.《汇编语言程式设计--基于ARM体系结构》(第2版),文全刚等主编,北京航空航天大学出版社,2010-8-1 基于ARM体系结构的处理器,是学习嵌入式技术的入门教材。 2.《零基础学AVR单片机》,徐益民等编着,机械工业出版社,2011-1-1 单片机概述、avr单片机的开发工具、avr单片机c语言、atmega16单片机基本结构、avr的指令系统与汇编系统等。 3.《基于Multisim10的51单片机仿真实战教程》,聂典,丁伟主编,电子工业出版社,2010-2-1 阐述了NI Multisim 10在单片机仿真中的各项主要功能。 4.《PIC18微控制器:体系结构、编程与接口设计》,(美)贝里着,清华大学出版社,2009-4-1 微控制器广泛套用于汽车、家电、工业控制、医疗设备等众多领域。本书以Microchip公司的PIC18系列微控制器为例,全面讲解如何使用C语言和汇编语言对微控制器进行编程。 5.《CASL汇编语言程式设计》,赵立辉编着,中国电力出版社,2002-10-1 CASL汇编语言是中国计算机软体专业技术资格和水平考试高级程式设计师级的必考内容。本书是讲述CASL汇编语言程式设计的专着。
❹ 汇编语言中 OUT DX,AL 指令操作过程是什么 OUT操作码实现的功能是什么
in和Out都是IO操作指令 , 例如out指令:OUT PortNo/DX, AL/AX
功能为把AL/AX的数据送到IO地址,IO地址如果大于FFH,则地址需要放入DX,要输出字节,默认使用AL寄存器,要输出字,默认使用AX寄存器。
例如:
MOV AL,10H //(将字节10H 从I/O端口70H 输出)
OUT 70H,AL
MOV AX,0010H //(将 字0010H 从I/O端口37FH 输出。)
MOV DX,37FH
OUT DX,AX
(4)编译器汇编指定用指令扩展阅读
编译环境
用汇编语言等非机器语言书写好的符号程序称为源程序,汇编语言编译器的作用是将源程序翻译成目标程序。目标程序是机器语言程序,当它被安置在内存的预定位置上后,就能被计算机的CPU处理和执行。
汇编的调试环境总的来说比较少,也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说,功能良好的编译器用起来应当非常方便,比如,应当可以自动整理格式、语法高亮显示,集编译、链接和调试为一体,方便实用。
对于广泛使用的个人计算机来说,可以自由选择的汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具备调试功能。如果是为了学习汇编语言,轻松汇编因为拥有一个完善的集成环境,是一款非常适合初学者的汇编编译器。
参考资料来源:网络-汇编语言
❺ 正常编写的c语言程序编译器会自动进行针对特定指令集用汇编语言优化吗
这个要看你使用什么编译器了。查看编译器的帮助文档,它会告诉你它支持那些指令集,并且做哪些可能的优化。
不同的编译器,是不一样的。
补充:GCC 不太清楚,你连VC++的版本都不说。汗,VC6是不支持SSE的,需要安装VC6SP5。
VS2005 和 VS2008 都支持 SSE。对 SSE/MMX 指令集优化得最好的,还是 Intel 的 c++ 编译器。
对并行和高性能计算,Fortran 的优势比较大。特别是 Fortran2003 的新特征,为并行计算做了很多专门的设定。Intel 也有 Fortran 的编译器。