15.2.6 asm语句
C编译器可在编译器输出的汇编语言程序中直接输出汇编指令或语句。利用asm语句嵌入汇编语言程序,可实现一些C语言
实现起来比较麻烦的硬件控制功能。
asm语句在语法上就象是调用一个函数名为asm的函数,函数参数是一个字符串:asm (“assembler text”);
编译器会直接将“参数字符串”复制到输出的汇编语言程序中,因此必须保证参数双引号之间的字符串是一个有效的汇编语言指令。
双引号之间的汇编指令必须以空格、制表符(TAB)、标记符(LABEL)或注释开头,这和汇编语言编程的要求是一致的。
编译器不会检查此汇编语句是否合法,如果语句中有错误,在汇编的过程中会被汇编器指出。使用asm指令应小心不要破坏C语言的环境。如果C代码中插入跳转指令和标记符可能会引起不可预料的操作结果。能够改变段或其它影响C语言环境的指令也可能引起麻烦。
对包含asm语句的程序使用优化器时要特别小心。优化器可以重新安排asm指令附近的代码顺序,这可能会引起不期望的结果。
15.2.7 访问I/O空间
读写I/O空间的功能是C编译器对标准C的扩展,是利用关键字ioport(I/O端口)来实现的。
ioport type port hexnum;
ioport指示这是定义一个端口变量的关键字。
type(类型)必须是char(字符)、short(短整型)、int(整型)或对应的无符号类型。
port hexnum为定义的端口变量,格式为“port”后面跟一个16进制数。
例如“port000A”是定义访问I/O空间地址0Ah的变量。
所有I/O端口的定义必须在文件级完成,不支持在函数级声明的I/O端口变量。
利用ioport关键字定义的I/O端口变量可以象一般变量一样进行赋值操作:ioport unsinged port10; /*访问I/O空间10h的变量*/
{
......
port10 = a; /*将a写到端口10h*/
......
b = port10; /*从端口10h读入b*/
......
}
端口变量的使用不仅限于赋值操作,用ioport关键字定义的I/O端口变量可象其它变量一样用在表达式中,例如:
a = port10 + b; /*读端口10h,加上b,结果赋给a*/
port10 += a;/*读端口10h,加上a,结果写回到端口10h*/
在进行函数调用的时候,可以做I/O端口变量的值传递,而不是引用,例如:
call (port10); /*读端口10h,将其值传递给函数调用*/
call (&port10); /*引用传递无效!*/
15.2.8 访问数据空间
访问数据空间是利用指针来实现的: