文档库 最新最全的文档下载
当前位置:文档库 › AT&T语法

AT&T语法

AT&T语法
AT&T语法

AT&T汇编与GCC内嵌汇编语法(转载)讨论AT&T的汇编语法,以及GCC的内嵌汇编语法。

0.3.2 Syntax

1.寄存器引用

引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。

80386有如下寄存器:

8个32-bit寄存器%eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp;

8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp;

8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低8位;

6个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;

3个控制寄存器:%cr0,%cr2,%cr3;

6个debug寄存器:%db0,%db1,%db2,%db3,%db6,%db7;

2个测试寄存器:%tr6,%tr7;

8个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。

2. 操作数顺序

操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)”

3. 立即数

使用立即数,要在数前面加符号$, 如“movl $0x04, %ebx”

或者:

para = 0x04

movl $para, %ebx

指令执行的结果是将立即数04h装入寄存器ebx。

4. 符号常数

符号常数直接引用如

value: .long 0x12a3f2de

movl value , %ebx

指令执行的结果是将常数0x12a3f2de装入寄存器ebx。

引用符号地址在符号前加符号$, 如“movl $value, % ebx”则是将符号value的地址装入寄存器ebx。

5. 操作数的长度

操作数的长度用加在指令后的符号表示b(byte, 8-bit), w(word, 16-bits), l(long, 32-bits),如“movb %al, %bl”,“movw %ax, %bx”,“movl %eax, %ebx ”。

如果没有指定操作数长度的话,编译器将按照目标操作数的长度来设置。比如指令“mov %ax, %bx”,由于目标操作数bx的长度为word,那么编译器将把此指令等同于“movw %ax, %bx”。同样道理,指令“mov $4, %ebx”等同于指令“movl $4, %ebx”,“push %al”等同于“pushb %al”。对于没有指定操作数长度,但编译器又无法猜测的指令,编译器将会报错,比如指令“push $4”。

6. 符号扩展和零扩展指令

绝大多数面向80386的AT&T汇编指令与Intel格式的汇编指令都是相同的,符号扩展指令和零扩展指令则是仅有的不同格式指令。

符号扩展指令和零扩展指令需要指定源操作数长度和目的操作数长度,即使在某些指令中这些操作数是隐含的。

在AT& T语法中,符号扩展和零扩展指令的格式为,基本部分"movs"和"movz"(对应Intel 语法的movsx和movzx),后面跟上源操作数长度和目的操作数长度。movsbl意味着movs (from)byte (to)long;movbw意味着movs (from)byte (to)word;movswl意味着movs (from)word (to)long。对于movz指令也一样。比如指令“movsbl %al, %edx”意味着将al寄存器的内容进行符号扩展后放置到edx寄存器中。

其它的Intel格式的符号扩展指令还有:

cbw -- sign-extend byte in %al to word in %ax;

cwde -- sign-extend word in %ax to long in %eax;

cwd -- sign-extend word in %ax to long in %dx:%ax;

cdq -- sign-extend dword in %eax to quad in %edx:%eax;

对应的AT&T语法的指令为cbtw,cwtl,cwtd,cltd。

7. 调用和跳转指令

段内调用和跳转指令为"call","ret"和"jmp",段间调用和跳转指令为"lcall","lret"和"ljmp"。

段间调用和跳转指令的格式为“lcall/ljmp $SECTION, $OFFSET”,而段间返回指令则为“lr et $STACK-ADJUST”。

8. 前缀

操作码前缀被用在下列的情况:

字符串重复操作指令(rep,repne);

指定被操作的段(cs,ds,ss,es,fs,gs);

进行总线加锁(lock);

指定地址和操作的大小(data16,addr16);

在AT&T汇编语法中,操作码前缀通常被单独放在一行,后面不跟任何操作数。例如,对于重复scas指令,其写法为:

repne

scas

上述操作码前缀的意义和用法如下:

指定被操作的段前缀为cs,ds,ss,es,fs,和gs。在AT&T语法中,只需要按照section:memory-operand的格式就指定了相应的段前缀。比如:lcall %cs:realmode_swtch 操作数/地址大小前缀是“data16”和"addr16",它们被用来在32-bit操作数/地址代码中指定16-bit的操作数/地址。

总线加锁前缀“lock”,它是为了在多处理器环境中,保证在当前指令执行期间禁止一切中断。这个前缀仅仅对ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,XCHG指令有效,如果将Lock前缀用在其它指令之前,将会引起异常。

字符串重复操作前缀"rep","repe","repne"用来让字符串操作重复“%ecx”次。

9. 内存引用

Intel语法的间接内存引用的格式为:

section:[base+index*scale+displacement]

而在AT&T语法中对应的形式为:

section:displacement(base,index,scale)

其中,base和index是任意的32-bit base和index寄存器。scale可以取值1,2,4,8。如果不指定scale值,则默认值为1。section可以指定任意的段寄存器作为段前缀,默认的段寄存器在不同的情况下不一样。如果你在指令中指定了默认的段前缀,则编译器在目标代码中不会产生此段前缀代码。

下面是一些例子:

-4(%ebp):base=%ebp,displacement=-4,section没有指定,由于base=%ebp,所以默认的section=%ss,index,scale没有指定,则index为0。

foo(,%eax,4):index=%eax,scale=4,displacement=foo。其它域没有指定。这里默认的section=%ds。

foo(,1):这个表达式引用的是指针foo指向的地址所存放的值。注意这个表达式中没有base 和index,并且只有一个逗号,这是一种异常语法,但却合法。

%gs:foo:这个表达式引用的是放置于%gs段里变量foo的值。

如果call和jump操作在操作数前指定前缀“*”,则表示是一个绝对地址调用/跳转,也就是说jmp/call指令指定的是一个绝对地址。如果没有指定"*",则操作数是一个相对地址。

任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸(byte,word,long),也就是说必须带有指令后缀(b,w,l)。

.3 GCC Inline ASM

GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM——GCC 内联汇编。这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写C/C++代码中使用汇编编写简洁高效的代码。

1.基本内联汇编

GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子:

__asm__("movl %esp,%eax"); // 看起来很熟悉吧!

或者是

__asm__("

movl $1,%eax // SYS_exit

xor %ebx,%ebx

int $0x80

");

__asm__(

"movl $1,%eax\r\t" \

"xor %ebx,%ebx\r\t" \

"int $0x80" \

);

基本内联汇编的格式是

__asm__ __volatile__("Instruction List");

1、__asm__

__asm__是GCC关键字asm的宏定义:

#define __asm__ asm

__asm__或asm用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。

2、Instruction List

Instruction List是汇编指令序列。它可以是空的,比如:__asm__ __volatile__(""); 或__asm__ ("");都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有Instruction List为空的内联汇编表达式都是没有意义的,比如:__asm__ ("":::"memory"); 就非常有意义,它向GCC声明:“我对内存作了改动”,GCC在编译的时候,会将此因素考虑进去。

我们看一看下面这个例子:

$ cat example1.c

int main(int __argc, char* __argv[])

{

int* __p = (int*)__argc;

(*__p) = 9999;

//__asm__("":::"memory");

if((*__p) == 9999)

return 5;

return (*__p);

}

在这段代码中,那条内联汇编是被注释掉的。在这条内联汇编之前,内存指针__p所指向的内存被赋值为9999,随即在内联汇编之后,一条if语句判断__p 所指向的内存与9999是否相等。很明显,它们是相等的。GCC在优化编译的时候能够很聪明的发现这一点。我们

使用下面的命令行对其进行编译:

$ gcc -O -S example1.c

选项-O表示优化编译,我们还可以指定优化等级,比如-O2表示优化等级为2;选项-S表示将C/C++源文件编译为汇编文件,文件名和C/C++文件一样,只不过扩展名由.c变为.s。

我们来查看一下被放在example1.s中的编译结果,我们这里仅仅列出了使用gcc 2.96在redhat 7.3上编译后的相关函数部分汇编代码。为了保持清晰性,无关的其它代码未被列出。

$ cat example1.s

main:

pushl %ebp

movl %esp, %ebp

movl 8(%ebp), %eax # int* __p = (int*)__argc

movl $9999, (%eax) # (*__p) = 9999

movl $5, %eax # return 5

popl %ebp

ret

参照一下C源码和编译出的汇编代码,我们会发现汇编代码中,没有if语句相关的代码,而是在赋值语句(*__p)=9999后直接return 5;这是因为GCC认为在(*__p)被赋值之后,在if语句之前没有任何改变(*__p)内容的操作,所以那条if语句的判断条件(*__p) == 9999肯定是为true的,所以GCC就不再生成相关代码,而是直接根据为true的条件生成return 5的汇编代码(GCC使用eax作为保存返回值的寄存器)。

我们现在将example1.c中内联汇编的注释去掉,重新编译,然后看一下相关的编译结果。

$ gcc -O -S example1.c

$ cat example1.s

main:

pushl %ebp

movl %esp, %ebp

movl 8(%ebp), %eax # int* __p = (int*)__argc

movl $9999, (%eax) # (*__p) = 9999

#APP

# __asm__("":::"memory")

#NO_APP

cmpl $9999, (%eax) # (*__p) == 9999 ?

jne .L3 # false

movl $5, %eax # true, return 5

jmp .L2

.p2align 2

.L3:

movl (%eax), %eax

.L2:

popl %ebp

ret

由于内联汇编语句__asm__("":::"memory")向GCC声明,在此内联汇编语句出现的位置内存内容可能了改变,所以GCC在编译时就不能像刚才那样处理。这次,GCC老老实实的将if语句生成了汇编代码。

可能有人会质疑:为什么要使用__asm__("":::"memory")向GCC声明内存发生了变化?明明“Instruction List”是空的,没有任何对内存的操作,这样做只会增加GCC生成汇编代码的数量。

确实,那条内联汇编语句没有对内存作任何操作,事实上它确实什么都没有做。但影响内存内容的不仅仅是你当前正在运行的程序。比如,如果你现在正在操作的内存是一块内存映射,映射的内容是外围I/O设备寄存器。那么操作这块内存的就不仅仅是当前的程序,I/O设备也会去操作这块内存。既然两者都会去操作同一块内存,那么任何一方在任何时候都不能对这块内存的内容想当然。所以当你使用高级语言C/C++写这类程序的时候,你必须让编译器也能够明白这一点,毕竟高级语言最终要被编译为汇编代码。

你可能已经注意到了,这次输出的汇编结果中,有两个符号:#APP和#NO_APP,GCC将内联汇编语句中"Instruction List"所列出的指令放在#APP和#NO_APP之间,由于__asm__("":::"memory")中“Instruction List”为空,所以#APP和#NO_APP中间也没有任何内容。但我们以后的例子会更加清楚的表现这一点。

关于为什么内联汇编__asm__("":::"memory")是一条声明内存改变的语句,我们后面会详细讨论。

刚才我们花了大量的内容来讨论"Instruction List"为空是的情况,但在实际的编程中,"Instruction List"绝大多数情况下都不是空的。它可以有1条或任意多条汇编指令。

当在"Instruction List"中有多条指令的时候,你可以在一对引号中列出全部指令,也可以将一条或几条指令放在一对引号中,所有指令放在多对引号中。如果是前者,你可以将每一条指令放在一行,如果要将多条指令放在一行,则必须用分号(;)或换行符(\n,大多数情况下\n后还要跟一个\t,其中\n是为了换行,\t是为了空出一个tab宽度的空格)将它们分开。比如:

__asm__("movl %eax, %ebx

sti

popl %edi

subl %ecx, %ebx");

__asm__("movl %eax, %ebx; sti

popl %edi; subl %ecx, %ebx");

__asm__("movl %eax, %ebx; sti\n\t popl %edi

subl %ecx, %ebx");

都是合法的写法。如果你将指令放在多对引号中,则除了最后一对引号之外,前面的所有引号里的最后一条指令之后都要有一个分号(;)或(\n)或(\n\t)。比如:

__asm__("movl %eax, %ebx

sti\n"

"popl %edi;"

"subl %ecx, %ebx");

__asm__("movl %eax, %ebx; sti\n\t"

"popl %edi; subl %ecx, %ebx");

__asm__("movl %eax, %ebx; sti\n\t popl %edi\n"

"subl %ecx, %ebx");

__asm__("movl %eax, %ebx; sti\n\t popl %edi;" "subl %ecx, %ebx");

都是合法的。

上述原则可以归结为:

任意两个指令间要么被分号(;)分开,要么被放在两行;

放在两行的方法既可以从通过\n的方法来实现,也可以真正的放在两行;

可以使用1对或多对引号,每1对引号里可以放任一多条指令,所有的指令都要被放到引号中。

在基本内联汇编中,“Instruction List”的书写的格式和你直接在汇编文件中写非内联汇编没有什么不同,你可以在其中定义Label,定义对齐(.align n ),定义段(.section name )。例如:

__asm__(".align 2\n\t"

"movl %eax, %ebx\n\t"

"test %ebx, %ecx\n\t"

"jne error\n\t"

"sti\n\t"

"error: popl %edi\n\t"

"subl %ecx, %ebx");

上面例子的格式是Linux内联代码常用的格式,非常整齐。也建议大家都使用这种格式来写

内联汇编代码。

3、__volatile__

__volatile__是GCC关键字volatile的宏定义:

#define __volatile__ volatile

__volatile__ 或volatile是可选的,你可以用它也可以不用它。如果你用了它,则是向GCC 声明“不要动我所写的Instruction List,我需要原封不动的保留每一条指令”,否则当你使用了优化选项(-O)进行编译时,GCC将会根据自己的判断决定是否将这个内联汇编表达式中的指令优化掉。

那么GCC判断的原则是什么?我试验了一下,发现一条内联汇编语句如果是基本内联汇编的话(即只有“Instruction List”,没有Input/Output/Clobber的内联汇编,我们后面将会讨论这一点),无论你是否使用__volatile__来修饰,GCC 2.96在优化编译时,都会原封不动的保留内联汇编中的“Instruction List”。但或许我的试验的例子并不充分,所以这一点并不能够得到保证。

为了保险起见,如果你不想让GCC的优化影响你的内联汇编代码,你最好在前面都加上__volatile__,而不要依赖于编译器的原则,因为即使你非常了解当前编译器的优化原则,你也无法保证这种原则将来不会发生变化。而__volatile__的含义却是恒定的。

2、带有C/C++表达式的内联汇编

GCC允许你通过C/C++表达式指定内联汇编中"Instrcuction List"中指令的输入和输出,你甚至可以不关心到底使用哪个寄存器被使用,完全靠GCC来安排和指定。这一点可以让程序员避免去考虑有限的寄存器的使用,也可以提高目标代码的效率。

我们先来看几个例子:

__asm__ (" " : : : "memory" ); // 前面提到的

__asm__ ("mov %%eax, %%ebx" : "=b"(rv) : "a"(foo) : "eax", "ebx");

__asm__ __volatile__("lidt %0": "=m" (idt_descr));

__asm__("subl %2,%0\n\t"

"sbbl %3,%1"

: "=a" (endlow), "=d" (endhigh)

: "g" (startlow), "g" (starthigh), "0" (endlow), "1" (endhigh));

怎么样,有点印象了吧,是不是也有点晕?没关系,下面讨论完之后你就不会再晕了。(当

然,也有可能更晕^_^)。讨论开始——

带有C/C++表达式的内联汇编格式为:

__asm____volatile__("Instruction List" : Output : Input : Clobber/Modify);

从中我们可以看出它和基本内联汇编的不同之处在于:它多了3个部分(Input,Output,Clobber/Modify)。在括号中的4个部分通过冒号(:)分开。

这4个部分都不是必须的,任何一个部分都可以为空,其规则为:

①如果Clobber/Modify为空,则其前面的冒号(:)必须省略。比如__asm__("mov %%eax, %%ebx" : "=b"(foo) : "a"(inp) : )就是非法的写法;而__asm__("mov %%eax, %%ebx" : "=b"(foo) : "a"(inp) )则是正确的。

②如果Instruction List为空,则Input,Output,Clobber/Modify可以不为空,也可以为空。比如__asm__ ( " " : : : "memory" );和__asm__(" " : : );都是合法的写法。

③如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:)既可以省略,也可以不省略。如果都省略,则此汇编退化为一个基本内联汇编,否则,仍然是一个带有C/C++表达式的内联汇编,此时"Instruction List"中的寄存器写法要遵守相关规定,比如寄存器前必须使用两个百分号(%%),而不是像基本汇编格式一样在寄存器前只使用一个百分号(%)。比如__asm__( " mov %%eax, %%ebx" : : );__asm__( " mov %%eax, %%ebx" : )和__asm__( " mov %eax, %ebx" )都是正确的写法,而__asm__( " mov %eax, %ebx" : : );__asm__( " mov %eax, %ebx" : )和__asm__( " mov %%eax, %%ebx" )都是错误的写法。

④如果Input,Clobber/Modify为空,但Output不为空,Input前的冒号(:)既可以省略,也可以不省略。比如__asm__( " mov %%eax, %%ebx" : "=b"(foo) : );__asm__( " mov %%eax, %%ebx" : "=b"(foo) )都是正确的。

⑤如果后面的部分不为空,而前面的部分为空,则前面的冒号(:)都必须保留,否则无法说明不为空的部分究竟是第几部分。比如,Clobber/Modify,Output为空,而Input不为空,则Clobber/Modify前的冒号必须省略(前面的规则),而Output 前的冒号必须为保留。

⑥如果Clobber/Modify不为空,而Input和Output都为空,则Input和Output前的冒号都必须保留。比如__asm__( " mov %%eax, %%ebx" : : "a"(foo) )和__asm__( " mov %%eax, %%ebx" : : : "ebx" )。

从上面的规则可以看到另外一个事实,区分一个内联汇编是基本格式的还是带有C/C++表达式格式的,其规则在于在"Instruction List"后是否有冒号(:)的存在,如果没有则是基本格式的,否则,则是带有C/C++表达式格式的。

两种格式对寄存器语法的要求不同:基本格式要求寄存器前只能使用一个百分号(%),这一点和非内联汇编相同;而带有C/C++表达式格式则要求寄存器前必须使用两个百分号(%%),其原因我们会在后面讨论。

1. Output

Output用来指定当前内联汇编语句的输出。我们看一看这个例子:

__asm__("movl %%cr0, %0": "=a" (cr0));

这个内联汇编语句的输出部分为"=r"(cr0),它是一个“操作表达式”,指定了一个输出操作。我们可以很清楚得看到这个输出操作由两部分组成:括号括住的部分(cr0)和引号引住的部分"=a"。这两部分都是每一个输出操作必不可少的。①括号括住的部分是一个C/C++表达式,用来保存内联汇编的一个输出值,其操作就等于C/C++的相等赋值cr0 = output_value,因此,括号中的输出表达式只能是C/C++的左值表达式,也就是说它只能是一个可以合法的放在C/C++赋值操作中等号(=) 左边的表达式。那么右值output_value从何而来呢?

②答案是引号中的内容,被称作“操作约束”(Operation Constraint),在这个例子中操作约束为"=a",它包含两个约束:等号(=)和字母a,其中等号(=)说明括号中左值表达式cr0是一个Write-Only的,只能够被作为当前内联汇编的输入,而不能作为输入。而字母a是寄存器EAX / AX / AL的简写,说明cr0的值要从eax寄存器中获取,也就是说cr0 = eax,最终这一点被转化成汇编指令就是movl %eax, address_of_cr0。现在你应该清楚了吧,操作约束中会给出:到底从哪个寄存器传递值给cr0。

另外,需要特别说明的是,很多文档都声明,所有输出操作的操作约束必须包含一个等号(=),但GCC的文档中却很清楚的声明,并非如此。因为等号(=)约束说明当前的表达式是一个Write-Only的,但另外还有一个符号——加号(+)用来说明当前表达式是一个Read-Write的,如果一个操作约束中没有给出这两个符号中的任何一个,则说明当前表达式是Read-Only 的。因为对于输出操作来说,肯定是必须是可写的,而等号(=)和加号(+)都表示可写,只不过加号(+) 同时也表示是可读的。所以对于一个输出操作来说,其操作约束只需要有等号(=)或加号(+)中的任意一个就可以了。

二者的区别是:等号(=)表示当前操作表达式指定了一个纯粹的输出操作,而加号(+)则表示当前操作表达式不仅仅只是一个输出操作还是一个输入操作。但无论是等号(=)约束还是加号(+)约束所约束的操作表达式都只能放在Output域中,而不能被用在Input域中。

另外,有些文档声明:尽管GCC文档中提供了加号(+)约束,但在实际的编译中通不过;我不知道老版本会怎么样,我在GCC 2.96中对加号(+)约束的使用非常正常。

我们通过一个例子看一下,在一个输出操作中使用等号(=)约束和加号(+)约束的不同。

$ cat example2.c

int main(int __argc, char* __argv[])

{

int cr0 = 5;

__asm__ __volatile__("movl %%cr0, %0":"=a" (cr0));

return 0;

}

$ gcc -S example2.c

$ cat example2.s

main:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl $5, -4(%ebp) # cr0 = 5

#APP

movl %cr0, %eax

#NO_APP

movl %eax, %eax

movl %eax, -4(%ebp) # cr0 = %eax[作输出的内联,起作用的语句在__asm__(“xxx”)之后]movl $0, %eax

leave

ret

这个例子是使用等号(=)约束的情况,变量cr0被放在内存-4(%ebp)的位置,所以指令mov %eax, -4(%ebp)即表示将%eax的内容输出到变量cr0中。

下面是使用加号(+)约束的情况:

$ cat example3.c

int main(int __argc, char* __argv[])

{

int cr0 = 5;

__asm__ __volatile__("movl %%cr0, %0" : "+a" (cr0));

return 0;

}

$ gcc -S example3.c

$ cat example3.s

main:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl $5, -4(%ebp) # cr0 = 5

movl -4(%ebp), %eax # input ( %eax = cr0 )

#APP

movl %cr0, %eax

#NO_APP

movl %eax, -4(%ebp) # output (cr0 = %eax )

movl $0, %eax

leave

ret

从编译的结果可以看出,当使用加号(+)约束的时候,cr0不仅作为输出,还作为输入,所使用寄存器都是寄存器约束(字母a,表示使用eax寄存器)指定的。关于寄存器约束我们后面讨论。

在Output域中可以有多个输出操作表达式,多个操作表达式中间必须用逗号(,)分开。例如:

__asm__(

"movl %%eax, %0 \n\t"

"pushl %%ebx \n\t"

"popl %1 \n\t"

"movl %1, %2"

: "+a"(cr0), "=b"(cr1), "=c"(cr2));

2、Input

Input域的内容用来指定当前内联汇编语句的输入。我们看一看这个例子:

__asm__("movl %0, %%db7" : : "a" (cpu->db7));

例中Input域的内容为一个表达式"a"[cpu->db7),被称作“输入表达式”,用来表示一个对当前内联汇编的输入。

像输出表达式一样,一个输入表达式也分为两部分:带括号的部分(cpu->db7)和带引号的部分"a"。这两部分对于一个内联汇编输入表达式来说也是必不可少的。

括号中的表达式cpu->db7是一个C/C++语言的表达式,它不必是一个左值表达式,也就是说它不仅可以是放在C/C++赋值操作左边的表达式,还可以是放在C/C++赋值操作右边的表达式。所以它可以是一个变量,一个数字,还可以是一个复杂的表达式(比如a+b/c*d)。比如上例可以改为:__asm__("movl %0, %%db7" : : "a" (foo)),__asm__("movl %0, %%db7" : : "a" (0x1000))或__asm__("movl %0, %%db7" : : "a" (va*vb/vc))。

引号号中的部分是约束部分,和输出表达式约束不同的是,它不允许指定加号(+)约束和等号(=)约束,也就是说它只能是默认的Read-Only的。约束中必须指定一个寄存器约束,例中的字母a表示当前输入变量cpu->db7要通过寄存器eax输入到当前内联汇编中。

我们看一个例子:

$ cat example4.c

int main(int __argc, char* __argv[])

{

int cr0 = 5;

__asm__ __volatile__("movl %0, %%cr0"::"a" (cr0));

return 0;

}

$ gcc -S example4.c

$ cat example4.s

main:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl $5, -4(%ebp) # cr0 = 5

movl -4(%ebp), %eax # %eax = cr0[作输入的内联,起作用的语句在__asm__(“xxx”)之前]

#APP

movl %eax, %cr0

#NO_APP

movl $0, %eax

leave

ret

我们从编译出的汇编代码可以看到,在"Instruction List"之前,GCC按照我们的输入约束"a",将变量cr0的内容装入了eax寄存器。

3. Operation Constraint

每一个Input和Output表达式都必须指定自己的操作约束Operation Constraint,我们这里来讨论在80386平台上所可能使用的操作约束。

1、寄存器约束

当你当前的输入或输入需要借助一个寄存器时,你需要为其指定一个寄存器约束。你可以直接指定一个寄存器的名字,比如:

__asm__ __volatile__("movl %0, %%cr0"::"eax" (cr0));

也可以指定一个缩写,比如:

__asm__ __volatile__("movl %0, %%cr0"::"a" (cr0));

如果你指定一个缩写,比如字母a,则GCC将会根据当前操作表达式中C/C++表达式的宽度决定使用%eax,还是%ax或%al。比如:

unsigned short __shrt;

__asm__ ("mov %0,%%bx" : : "a"(__shrt));

由于变量__shrt是16-bit short类型,则编译出来的汇编代码中,则会让此变量使用%ex寄存器。编译结果为:

movw -2(%ebp), %ax # %ax = __shrt

#APP

movl %ax, %bx

#NO_APP

无论是Input,还是Output操作表达式约束,都可以使用寄存器约束。

下表中列出了常用的寄存器约束的缩写。

约束Input/Output 意义

r I,O 表示使用一个通用寄存器,由GCC 在%eax/%ax/%al, %ebx/%bx/%bl, %ecx/%cx/%cl, %edx/%dx/%dl中选取一个GCC认为合适的。

q I,O 表示使用一个通用寄存器,和r的意义相同。

a I,O 表示使用%eax / %ax / %al

b I,O 表示使用%ebx / %bx / %bl

c I,O 表示使用%ecx / %cx / %cl

d I,O 表示使用%edx / %dx / %dl

D I,O 表示使用%edi / %di

S I,O 表示使用%esi / %si

f I,O 表示使用浮点寄存器

t I,O 表示使用第一个浮点寄存器

u I,O 表示使用第二个浮点寄存器

2、内存约束

如果一个Input/Output操作表达式的C/C++表达式表现为一个内存地址,不想借助于任何寄存器,则可以使用内存约束。比如:

__asm__ ("lidt %0" : "=m"(__idt_addr)); 或__asm__ ("lidt %0" : :"m"(__idt_addr));

我们看一下它们分别被放在一个C源文件中,然后被GCC编译后的结果:

$ cat example5.c

// 本例中,变量sh被作为一个内存输入

int main(int __argc, char* __argv[])

{

char* sh = (char*)&__argc;

__asm__ __volatile__("lidt %0" : : "m" (sh));

return 0;

}

$ gcc -S example5.c

$ cat example5.s

main:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

leal 8(%ebp), %eax

movl %eax, -4(%ebp) # sh = (char*) &__argc

#APP

lidt -4(%ebp)

#NO_APP

movl $0, %eax

leave

ret

$ cat example6.c

// 本例中,变量sh被作为一个内存输出

int main(int __argc, char* __argv[])

{

char* sh = (char*)&__argc;

__asm__ __volatile__("lidt %0" : "=m" (sh));

return 0;

}

$ gcc -S example6.c

$ cat example6.s

main:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

leal 8(%ebp), %eax

movl %eax, -4(%ebp) # sh = (char*) &__argc

#APP

lidt -4(%ebp)

#NO_APP

movl $0, %eax

leave

ret

首先,你会注意到,在这两个例子中,变量sh没有借助任何寄存器,而是直接参与了指令lidt的操作。

其次,通过仔细观察,你会发现一个惊人的事实,两个例子编译出来的汇编代码是一样的!虽然,一个例子中变量sh作为输入,而另一个例子中变量sh作为输出。这是怎么回事?

原来,使用内存方式进行输入输出时,由于不借助寄存器,所以GCC不会按照你的声明对其作任何的输入输出处理。GCC只会直接拿来用,究竟对这个C/C++表达式而言是输入还是输出,完全依赖与你写在"Instruction List"中的指令对其操作的指令。

由于上例中,对其操作的指令为lidt,lidt指令的操作数是一个输入型的操作数,所以事实上对变量sh的操作是一个输入操作,即使你把它放在Output域也不会改变这一点。所以,对此例而言,完全符合语意的写法应该是将sh放在Input域,尽管放在Output域也会有正确的执行结果。

所以,对于内存约束类型的操作表达式而言,放在Input域还是放在Output域,对编译结果是没有任何影响的,因为本来我们将一个操作表达式放在Input域或放在Output域是希望GCC能为我们自动通过寄存器将表达式的值输入或输出。既然对于内存约束类型的操作表达式来说,GCC不会自动为它做任何事情,那么放在哪儿也就无所谓了。但从程序员的

角度而言,为了增强代码的可读性,最好能够把它放在符合实际情况的地方。

约束Input/Output 意义

m I,O 表示使用系统所支持的任何一种内存方式,不需要借助寄存器〔关键字m〕

3、立即数约束

如果一个Input/Output操作表达式的C/C++表达式是一个数字常数,不想借助于任何寄存器,则可以使用立即数约束。

由于立即数在C/C++中只能作为右值,所以对于使用立即数约束的表达式而言,只能放在Input域。

比如:__asm__ __volatile__("movl %0, %%eax" : : "i" (100) );

立即数约束很简单,也很容易理解,我们在这里就不再赘述。

约束Input/Output 意义

i I 表示输入表达式是一个立即数(整数),不需要借助任何寄存器

F I 表示输入表达式是一个立即数(浮点数),不需要借助任何寄存器

4、通用约束

约束Input/Output 意义

g I,O 表示可以使用通用寄存器,内存,立即数等任何一种处理方式。

0,1,2,3,4,5,6,7,8,9 I 表示和第n个操作表达式使用相同的寄存器/内存。

通用约束g是一个非常灵活的约束,当程序员认为一个C/C++表达式在实际的操作中,究竟使用寄存器方式,还是使用内存方式或立即数方式并无所谓时,或者程序员想实现一个灵活的模板,让GCC可以根据不同的C/C++表达式生成不同的访问方式时,就可以使用通用约束g。比如:

#define JUST_MOV(foo) __asm__ ("movl %0, %%eax" : : "g"(foo))

JUST_MOV(100)和JUST_MOV(var)则会让编译器产生不同的代码。

int main(int __argc, char* __argv[])

{

JUST_MOV(100);

return 0;

}

编译后生成的代码为:

main:

pushl %ebp

movl %esp, %ebp

#APP

movl $100, %eax

#NO_APP

movl $0, %eax

popl %ebp

ret

很明显这是立即数方式。而下一个例子:

int main(int __argc, char* __argv[])

{

JUST_MOV(__argc);

return 0;

}

经编译后生成的代码为:

main:

pushl %ebp

movl %esp, %ebp

#APP

movl 8(%ebp), %eax

#NO_APP

movl $0, %eax

popl %ebp

ret

这个例子是使用内存方式。

一个带有C/C++表达式的内联汇编,其操作表达式被按照被列出的顺序编号,第一个是0,第2个是1,依次类推,GCC最多允许有10个操作表达式。比如:

__asm__ ("popl %0 \n\t"

"movl %1, %%esi \n\t"

"movl %2, %%edi \n\t"

: "=a"(__out)

: "r" (__in1), "r" (__in2));

此例中,__out所在的Output操作表达式被编号为0,"r"(__in1)被编号为1,"r"(__in2)被编号为2。

再如:

__asm__ ("movl %%eax, %%ebx" : : "a"(__in1), "b"(__in2));

此例中,"a"(__in1)被编号为0,"b"(__in2)被编号为1。

如果某个Input操作表达式使用数字0到9中的一个数字(假设为1)作为它的操作约束,则等于向GCC声明:“我要使用和编号为1的Output操作表达式相同的寄存器(如果Output 操作表达式1使用的是寄存器),或相同的内存地址(如果Output操作表达式1使用的是内存)”。上面的描述包含两个限定:数字0到数字9作为操作约束只能用在Input操作表达式中,被指定的操作表达式(比如某个Input操作表达式使用数字1作为约束,那么被指定的就是编号为1的操作表达式)只能是Output操作表达式。

由于GCC规定最多只能有10个Input/Output操作表达式,所以事实上数字9作为操作约束永远也用不到,因为Output操作表达式排在Input操作表达式的前面,那么如果有一个Input操作表达式指定了数字9作为操作约束的话,那么说明Output操作表达式的数量已经至少为10个了,那么再加上这个Input操作表达式,则至少为11个了,以及超出GCC的限制。

5、Modifier Characters(修饰符)

等号(=)和加号(+)用于对Output操作表达式的修饰,一个Output操作表达式要么被等号(=)修饰,要么被加号(+)修饰,二者必居其一。使用等号(=)说明此Output操作表达式是Write- Only的,使用加号(+)说明此Output操作表达式是Read-Write的。它们必须被放在约束字符串的第一个字母。比如"a="(foo)是非法的,而"+g"(foo)则是合法的。

当使用加号(+)的时候,此Output表达式等价于使用等号(=)约束加上一个Input表达式。比如

__asm__ ("movl %0, %%eax; addl %%eax, %0" : "+b"(foo)) 等价于

__asm__ ("movl %1, %%eax; addl %%eax, %0" : "=b"(foo) : "b"(foo))

但如果使用后一种写法,"Instruction List"中的别名也要相应的改动。关于别名,我们后面会讨论。

像等号(=)和加号(+)修饰符一样,符号(&)也只能用于对Output操作表达式的修饰。当使用它进行修饰时,等于向GCC声明:"GCC不得为任何Input操作表达式分配与此Output操作表达式相同的寄存器"。其原因是&修饰符意味着被其修饰的Output操作表达式要在所有

(完整版)英语语法专业术语

英语语法专业术语 语法grammar 句法syntax 词法morphology 结构structure 层次rank 句子sentence 从句clause 词组phrase 词类part of speech 单词word 实词notional word 虚词structural word 名词noun 专有名词proper noun 普通名词common noun 可数名词countable noun 不可数名词uncountable no 抽象名词abstract noun 具体名词concrete noun 物质名词material noun 集体名词collective noun 个体名词individual noun 介词preposition 连词conjunction 动词verb 主动词main verb 及物动词transitive verb 不及物动词intransitive verb 系动词link verb 助动词auxiliary verb 情态动词modal verb 规则动词regular verb 不规则动词irregular verb 短语动词phrasal verb 限定动词finite verb 非限定动词infinite verb 使役动词causative verb 感官动词verb of senses

动态动词event verb 静态动词state verb 感叹词exclamation 形容词adjective 副词adverb 方式副词adverb of manner 程度副词adverb of degree 时间副词adverb of time 地点副词adverb of place 修饰性副词adjunct 连接性副词conjunct 疑问副词interrogative adverb 关系副词relative adverb 代词pronoun 人称代词personal pronoun 物主代词possessive pronoun 反身代词reflexive pronoun 相互代词reciprocal pronoun 指示代词demonstrative pronoun 疑问代词interrogative pronoun 关系代词relative pronoun 不定代词indefinite 物主代词possessive pronoun 名词性物主代词nominal possessive 形容词性物主代词adjectival possessive pronoun 冠词article 定冠词definite article 不定冠词indefinite article 数词numeral 基数词cardinal numeral 序数词ordinal numeral 分数词fractional numeral 形式form 单数形式singular form 复数形式plural form 限定动词finite verb form 非限定动词non-finite verb form

现代汉语语法特点

现代汉语语法特点 本节课的内容(参考P232,P7) ?分析现代汉语语法的主要特点 ?重点:用具体的语言事实理解现代汉语语法的特点。 ?思考题(1-3) ? 1.对比下面的材料,理解汉英两种语言在语法方面的差异。 ?(1)a child;two children ?一个小孩;两个小孩 ?(2)She is always ready to help us. 他随时都在准备帮助我们。 ?We are always ready to help her. 我们随时都在准备帮助他。 ?理解:语法方面的差异是什么? ? 2.对比下面的材料,理解汉英两种语言在语法方面的差异。 ?(1)He criticized my taking risks. 他批评了我的冒险活动。 ?(2)His criticism doesn't worry me. ?他的批评不会使我不安。 (3)I don't like to read his literary criticism. 我不喜欢读他的文学批评。 ?理解:语法方面的差异是什么? ?小结:“汉英语语法方面的差异” ?(1)汉语有个体量词,而英语没有。 ?(2)英语这一类的印欧语言有丰富的形态变化,而汉语没有。英语用不同的形态来表示相应的语法意义,比如英语的名词有数的变化(a book:two books),代词有主格宾格的变化(I:me;he:him;she:her),动词有时、体、态的变化(study,studies,studying,studied),等等。 ?思考题 ? 3.观察下面这段文字,体会句子的差异是由什么造成的。 ?辣妹子从小辣不怕辣妹子长大不怕辣辣妹子嫁人怕不辣 辣妹子从来辣不怕辣妹子生性不怕辣辣妹子出门怕不辣 体会意义:不怕辣辣不怕怕不辣 ?类似的例子不怕难难不怕怕不难 做人难难做人人难做 想吃饭想饭吃饭想吃 ?小结:“汉语语法方面的特点” ?语序可以表达不同的意义,可以造成不同的结构。语序在汉语中的地位十分重要。 ?分析方法现代汉语汉语语法特点只有在对比中发现,比如和印欧语对比。主要有5个方面的特点。 ?现代汉语语法的特点 ?(一)汉语没有严格意义的形态变化 ?(二)语序和虚词是汉语主要的语法手段 ?(三)汉语中词类与句法成分之间不是简单的对应关系 ?(四)汉语中词、短语和句子的结构方式基本一致 ?(五)汉语里有丰富的量词和语气词

英语语法习题及解析

高考英语语法练习题精选 1. --Hello, this is . A. How are you? B. Will you come tonight? C. Can I take a mesage? D. Is that Mike? 2. Tom suggested that we __________such a meeting, but Jenny insisted that it _________of great importance. A. not hold ; should be B. didn't hold ; be C. hold ; was D. not hold ; was 3. You should take the medicine after you read the __________. A. lines B. instructions C. words D. suggestions 4. --Hi, Tracy, you look tired. --I am tired. I__________ the living-room all day. A. painted B. have been painting C. had painted D. have painted 5. I'm sorry. I _____________ you__________ to me. A. don't know; are speaking B. don't know ;were speaking C. didn't know; were speaking D. didn't know; are speaking 6. "Please __________why you're so late," said his girlfriend. A. excuse B. explain C. apologize D. tell 7. The rescue team made every __________ to find the missing mountain climber.

英语语法术语汇总

BE-subjunctive be-型虚拟式 object complement 宾语补语 noun phrase of amount or quantity 表示数量概念的名词词组 infinitive 不定式full sentence完全句headword中心词 dynamic verb 动态动词cleft sentence 分裂句main clause主句 nominative absolute construction 独立主格结构direct object 直接宾语 present perfective progressive 现在完成进行体subject complement主语补语 predicate verb 谓语动词determiner限定词ordinal numeral序数词 verbless clause 无动词分句finite verb phrase限定动词词组 possessive pronoun 物主代词gender性main verb 主动词 antecedent先行项subjunctive mood 虚拟式irregular verb 不规则动词root 词根demonstrative pronoun指示代词 semi-auxiliary 半助动词compound complex

sentence 并列复杂句 passive voice 被动态coordinate construction 并列结构 comparative clause 比较分句 indefinite pronoun 不定代词 intransitive verb不及物动词vocabulary词汇bound morpheme粘附词素 uncountable noun不可数名词morpheme词素central determiner中位限定词 indicative mood 陈述式affix 词缀proper noun专有名词 abstract noun 抽象名词phrasal verb 词组动词 notional concord 意义一致原则auxiliary助动词active voice主动态 open class 开放词类linking verb 连系动词historical present 历史性现在时conjunction 连词 unit noun 单位名词reflexive pronoun 反身代词 second person 第二人称unemphatic use非强调性用法 definite article 定冠词basic clause type分句基本

常用英语语法-日常

一、引出开头 1:It is well-known to us that……(我们都知道……)==As far as my knowledge is concerned, …(就我所知…) 2:Recently the problem of…… has been brought into focus. ==Nowadays there is a growing concern over ……(最近……问题引起了关注) 3:Nowadays(overpopulation)has become a problem we have to face.(现今,人口过剩已成为我们不得不面对的问题) 4:Internet has been playing an increasingly important role in our day-to-day life. It has brought a lot of benefits but has created some serious problems as well.(互联网已在我们的生活扮演着越来越重要的角色,它给我们带来了许多好处但也产生了一些严重的问题)5:With the rapid development of science and technology,more and more people believe that……(随着科技的迅速发展,越来越多的人认为……) 6:It is a common belief that……==It is commonly believed that……(人们一般认为……)7:A lot of people seem to think that……(很多人似乎认为……) 8:It is universally acknowledged that + 句子(全世界都知道...) 二、表达不同观点 1:People's views on……vary from person to person. Some hold that……However, others believe that……(人们对……的观点因人而异,有些人认为……然而其他人却认为……)2:People may have different opinions on……(人们对……可能会持有不同见解) 3:Attitudes towards (drugs)vary from person to person.==Different people hold different attitudes towards(failure)(人们对待吸毒的态度因人而异) 4:There are different opinions among people as to……(对于……人们的观点大不相同) 三、表示结尾 1:In short, it can be said that……(总之,他的意思是……) 2:From what has been mentioned above, w e can come to the conclusion that……(从上面提到的,我们可以得出结论……) 3:Taking all these factors into consideration, we naturally/reasonably come to the conclusion that……(把所有的这些因素加以考虑,我们自然可以得出结论……) 4:Hence/Therefore, we'd better come to the conclusion that……(因此,我们最好的出这样的结论……) 5:There is no doubt that (job-hopping)has its drawbacks as well as merits.(毫无疑问,跳槽有优点也有缺点) 6:All in all, we cannot live without……,but at the same time we must try to find out new ways to cope with the problems that would arise.(总之,我们没有……无法生活,但同时我们必须寻求新的解决办法来面对可能出现的新问题) 四、提出建议 1:It is high time that we put an end to the (trend).(该是我们停止这一趋势的时候了)2:There is no doubt that enough concern must be paid to the problem of……(毫无疑问,对……问题应予以足够重视) 3:Obviously ,if we want to do something … it is essential that……(显然,如果我们想要做么事,很重要的是……) 4:Only in this way can we ……(只有这样,我们才能……) 5:Spare no effort to+V(不遗余力的) 五、预示后果

英语语法与作文

历年中考英语常考英语语法250例(一) 2012-02-17 14:17:43 [来源]:互联网[作者]:佚名 大中小 1 (see 、hear 、notice 、find 、feel 、listen to 、 look at (感官动词)+do eg:I like watching monkeys jump 2 (比较级 and 比较级)表示越来越怎么样 3 a piece of cake =easy 小菜一碟(容易) 4 agree with sb 赞成某人 5 all kinds of 各种各样 a kind of 一样 6 all over the world = the whole world 整个世界 7 along with同……一道,伴随…… eg : I will go along with you我将和你一起去 the students planted trees along with their teachers 学生同老师们一起种树 8 As soon as 一怎么样就怎么样 9 as you can see 你是知道的 10 ask for ……求助向…要…(直接接想要的东西) eg : ask you for my book 11 ask sb for sth 向某人什么 12 ask sb to do sth 询问某人某事 ask sb not to do 叫某人不要做某事 13 at the age of 在……岁时 eg:I am sixteen I am at the age of sixteen 14 at the beginning of …………的起初;……的开始 15 at the end of +地点/+时间最后;尽头;末尾 eg : At the end of the day 16 at this time of year 在每年的这个时候 17 be /feel confident of sth /that clause +从句感觉/对什么有信心,自信 eg : I am / feel confident of my spoken English I feel that I can pass the test 18 be + doing 表:1 现在进行时 2 将来时 19 be able to (+ v 原) = can (+ v 原)能够…… eg : She is able to sing She can sing 20 be able to do sth 能够干什么 eg :she is able to sing 21 be afraid to do (of sth 恐惧,害怕……eg : I'm afraed to go out at night I'm afraid of dog 22 be allowed to do 被允许做什么 eg: I'm allowed to watch TV 我被允许看电视I should be allowed to watch TV 我应该被允许看电视 23 be angry with sb 生某人的气eg : Don't be angry with me 24 be angry with(at) sb for doing sth 为什么而生某人的气 25 be as…原级…as 和什么一样eg : She is as tall as me 她和我一样高

经典英语语法讲解解析

三天搞定英语语法 英语语法分为两个部分。一个部分是词法,即词的构成和词的使用规律。另一个部分是句法,即句子的组成和句子的使用方法。 英语语法的特点可以用三句话来表示:1、每个词都有词性;2、每句话都有动词(实意动词或系动词);3、每句话都必须符合五个基本句型。 三句话用一句话来说,就是,标出句中每一个单词的词性,找出句中所有动词,并标出其种类和相应的句子成分。理解,掌握,运用好这句话,按照一:词性;二:动词种类;三:动词相对应的句子成分;四:从句;五:非谓语动词方法就能透彻理解英语语法体系。 词的分类 词类又叫词性,英语单词根据其在句子中的功能,可以分成十个大类。 词类词义英语名称缩写形式例词中译 noun n. student 学生 1、名词表示人、事物、地点或抽象概念的名 称。 2、代词主要用来代替名词。pronoun pron. you 你 3、形容词表示人或事物的性质或特征。adjective adj. happy 高兴的 4、数词表示数目或事物的顺序。numeral num. three 三 5、动词表示动作或状态。verb v. cut 砍、割 adverb adv. quickly 迅速地 6、副词修饰动词、形容词或其他副词,说明时 间、地点、程度等。 7、冠词用在名词前,帮助说明名词。article art. a 一个 preposition prep. at 在... 8、介词表示它后面的名词或代词与其他句 子成分的关系。 9、连词用来连接词、短语或句子。conjunction conj. and 和 10、感叹词表示喜、怒、哀、乐等感情。interjection interj. Oh 哦 词性的分类: 修饰: 形容数冠代词名词 (red)(one)(a/the)(my)wood 1.名词 代替: 代词it 形容词the red 数词one

英语语法专业术语表达

英语语法专业术语表达 英语语法语语语语表达 1. Morphology 语法 2,Notional Words 语语语3, Form Words 虚语 4,Parts of Speech 语语 5,The Noun 名语 6,The Pronoun 代语 7,The Numeral 数语 8,The Verb 语语 9,The Adjective 形容语 10. The Adverb 副语 11. The Article 冠语 12. The Preposition 介语 13. The conjunction 语语 14. The Interjection 感语语15. The Particle 小品语 16. Word Building 构语法17. Conversion 语化 18. Derivation 派生 19. Composition 合成 20. Prefix 前语 21. Suffix 后语 22. Compound Words 合成语23. Classification of Nouns 名语的分语

24. Common Nouns 普通名语 25. Proper Nouns 语有名语26. Countable Nouns 可名语数27. Uncountable Nouns 不可名语数28. The Singular Form 语形式数29. The Plural Form 语形式数 30. Individual Nouns个体名语31. Collective Nouns集名语体32. Material Nouns物语名语33. Abstract Nouns抽象名语34. The Common Case普通格35. The Possessive Case所有格36, Personal Pronouns 人代语称37. Possessive Pronouns物主代语38. Self Pronouns反身代语39. Demonstrative Pronouns指示代语40. Interrogative Pronouns疑语代语不意达41. Conjunctive Pronouns语接代语42. Relative Pronouns语系代语43. Indefinite Pronouns不定代语44. Reciprocal Pronouns相互代语45. The Subjective Case主格46. The Objective Case语格47. Cardinal Numerals基语数48. Ordinal Numerals 序语数49. Fractional Numerals分语数50,Notional Verbs语意语语 51. Link Verbs语系语语 52. Auxiliary Verbs助语语 53. Modal Verbs情语语语 54. Transitive Verbs及物语语 55. Intransitive Verbs不及物语语56. Regular Verbs语语语语 57. Irregular Verbs不语语语语 58. Person人称 59. Number数 60. Tense语语 61. Voice语语 62. Mood语气

英语语法术语

常见的语法术语摘要 1.名词noun 动词verb 形容词adjective 数词numeral 代词 pronoun 2.介词preposition 副词adverb 连词conjunction 冠词article 感叹词 interjection 3.结构:structure 简单句simple sentences 并列句compound sentences 4.复合句complex sentences 倒装句inverted sentences 省略句elliptical sentences 5.陈述句declarative sentences 疑问句interrogative sentences 6.祈使句imperative sentences 感叹句exclamatory sentences 7.否定句negative sentences 被动句passive sentences 8.虚拟语气句subjunctive sentences 同义句synonymous sentences 9.歧义句ambiguous sentences 委婉句euphemisms 强调句emphasis 10.疑难句difficult sentences 叙述句narrative sentences 说明句expository sentences 11.议论句argumentative sentences 人物描写句descriptive sentences of people 12.动作描写句:descriptive sentences of actions 13.环境描写句descriptive sentences of environment 14.名人语句quotations 格言句maxims 谚语句proverbs 15.状语adverbial 补语complement 宾语object 宾语补助语objective complement 16.表语predicative 主语subject 谓语predicate 谓语动词finite verb 17.非谓语动词non-finite verb 情态动词modal verb 18.并列coordination 选择alternative 转折transition 对比contrast 19.原因cause 结果effect 20.动词时态verb tenses 21.一般现在时simple present (tense) 22.一般过去时simple past (tense) 一般将来时simple future (tense) 23.过去将来时future (tense) in the past 现在完成时present perfect (tense) 24.过去完成时past perfect (tense) 将来完成时future perfect (tense) 25.现在进行时present continuous (tense) 过去进行时past continuous (tense) 26.将来进行时future continuous (tense) 27.现在完成进行时present perfect continuous (tense) 28.主句main clause 从句subordinate clause 29.限定性定语从句restrictive attributive clause 30.非限定性定语从句non-restrictive attributive clause 31.宾语从句object clause 壮语从句adverbial clause 主语从句subject clause 32.表语从句predicative clause 同位语从句appositive clause 33.双重复合句double complex sentences 34.多重复合句multiple complex sentences 35.插入语parenthesis 36.IT引导的句子IT sentences

语法讲义.docx

《语法讲义》读后感 本学期在老师的推荐下,我读了朱德熙先生的《语法讲义》。在读这本书的时候,总是会忍不住想做笔记梳理知识点,作为一个中文系的学生来讲,这可能是由于在大一时期长期处于被《现代汉语》支配的恐惧所造成的。朱德熙先生的《语法讲义》是语法学界最有权威的一部语法学著作,读这本书时,大部分是熟悉的内容,尽管熟悉,但是以前这些语法知识,我头脑中是混乱不成体系的,因为我一直对语法方面不太敏感。读这本著作时,每读一部分,就会梳理清楚一些。读完之后,虽然忘记的也很多,但是我还是觉得收获不小。本篇读后感我想从这些内容的归纳,收获以及启示、还有存疑的地方这三点来完成。 一、语法讲义的主要内容 《语法讲义》这本著作分为了十八章来讲,分别就语法单位、词的构造、词类、句型等内容做了多方面,具体的阐释。下面主要是对一些主要章节具体内容的归纳阐释。 第一章为语法单位,从语素、词、词组、句子等最基本的语法内容讲起。在这一章里我了解到了语素作为语法系统里的基本符号,有单音节语素、多音节语素;自由语素、粘着语素;定位语素、不定位语素、成词语素、不成词语素等不同方向上的分类。词是比语素高一级的单位,它可以分为单纯词和合成词。在区分是不是词的时候,朱德熙先生归纳了目前存在的三种方法,我们可以根据能不能单独成句、语言成分活动能力的强弱、扩展法等三种方法来判定是不是词,朱德熙先生指出,这三种方法其实是有着各自不同的缺陷的,比如在划分“铁路”、“白菜”、“理发”等词语时,都不能根据其中单一的标准来划分,否则就会出现歧义。所以我们在划分一个词的时候,需要综合运用多种分类方法,具体问题具体分析。在本章中,朱德熙先生还讲到了词组,并具体阐释了词组的几大类型:偏正结构、述宾结构、述补结构、主谓结构、连谓结构。并通过举例“我们班有许多外国留学生”来介绍了层次分析的具体应用以及二分法。在本章中,朱德熙先生还指出任何句法结构都可以从两个不同的方面来观察,一个看句子的内部结构,一个看语法功能。本章的第四节是句子。本节中介绍了句子的分类,从结构上分为单句和复句两大类,单句又可分为主谓句和非主谓句。从句子的功能上看,又可以把它分成陈述句、疑问句、祈使句、称呼句、感叹句五类,朱德熙先生指出,形式与功能之间的关系是错综的,因此这五类句子有交叉的情形。 第二章的主要内容为词的构造,主要讲了几种词的构造的主要类型。如重叠式、附加式、前缀、后缀、复合式等类型的词的构成方式,并细化了其中的一些分类,比如重叠式副词中的基式,附加式中区分一些附加式词语与复合词的辨析,后缀中的副词后缀、状态形容词后缀、“的”与“得”的区别等。并对一些复杂的合成词,以及特殊的复合词中的紧缩式与减缩式进行了区分。并对并立式复合词进行了具体阐释。 第三章从大的层面上讲述了词类的知识。本章首先介绍了划分词类的几大依据:词的意义、语法功能、形态变化三大方面划分,但朱德熙先生指出,实际上根据词的意义来划分词类的方法是行不通的,虽然词的语法功能和意义之间有着密切联系,但是我们在划分词类的时候,只能根据词的语法功能来划分。在印欧语系中,比较适合运用词的形态变化来划分词类,而汉语由于缺乏形态变化,只能通过词的语法功能来进行分类。除此之外,本章还讲到了词的共性与个性,词的兼类等内容。朱德熙先生还指出,汉语的词分为实词与虚词两大类,并具体阐

中考必考的30个英语句型,包含词汇,短语和语法解释

中考必考的30个英语句型,包含词汇,短语和语法解释 1as…as 和……一样 中间必须用形容词或副词原级。例如: This classroom is as big as that one. 这间教室和那间一样大。 He runs as fast as Tom. 他和汤姆跑的一样快。 否定结构:not as/so…as,“不如……”。上面的两个句子可分别改为: This classroom is not as/so large as that one.这间教室不如那间大。 He doesn’t run as/so fast as Tom.他跑得不如汤姆快。 2as soon as 一……就…… 用来引导时间状语从句。若主句是一般将来时,从句要用一般现在时。例如: I’ll tell him the plan as soon as I see him. 我一看到他就告诉他这个计划。 He’ll go home as soon as he finishes his work. 他一完成工作就回家。 3be busy/enjoy/hate/go on/finish doing sth. 忙于/喜欢/讨厌/继续/完成做某事在enjoy, finish, hate, go on, be busy等词语后,一般用动词-ing形式作宾语。例如: Lin Tao is busy making a model plane. 林涛正忙着做飞机模型。 My mother enjoys taking a walk after supper. 我妈妈喜欢晚饭后散步。 I hate watching Channel Five. 我讨厌看五频道。

最新英语语法专业术语整理

英语语法专业术语 本次听写要求:挑选部分英语术语打在PPT上,学生按序号写出相应中文术语。(一)词类part of speech 实词notional word ['n?u??n?l] 虚词structural word/ form word (e.g. article preposition conjunction interjection) 派生词derivative [di'riv?tiv, d?'riv?tiv] 复合词compound ['k?mpaund,k?m'paund] 词性part of speech 名词noun 专有名词proper noun 普通名词common noun 可数名词countable noun 不可数名词uncountable noun 单数形式singular form 复数形式plural form ['plu?r?l, 'plur?l] 抽象名词abstract noun [?b'str?kt,'?bstr?kt] 具体名词concrete noun ['k?nkri:t] 物质名词material noun 集体名词collective noun 个体名词individual noun 动词verb 主动词main verb 及物动词transitive verb ['tr?nsitiv, 'tr?ns?tiv] 不及物动词intransitive verb [in'tr?nsitiv, in'tr?ns?tiv] 系动词link verb 助动词auxiliary verb [?:g'zilj?ri] 情态动词modal verb 规则动词regular verb 不规则动词irregular verb 短语动词phrasal verb ['freizl, 'freiz?l] 限定动词finite verb ['fainait] 非限定动词infinite verb ['infinit, 'inf?nit] 使役动词causative verb ['k?:z?tiv] 感官动词verb of senses 动态动词event verb 静态动词state verb 形容词adjective 比较等级degrees of comparison ☆原级positive degree ☆比较级comparative degree

英语语法1术语汇总

BE-subjunctive be-型虚拟式object complement 宾语补语 noun phrase of amount or quantity 表示数量概念的名词词组 infinitive 不定式full sentence完全句headword中心词dynamic verb 动态动词cleft sentence 分裂句main clause主句nominative absolute construction 独立主格结构direct object 直接宾语present perfective progressive现在完成进行体subject complement主语补语predicate verb 谓语动词determiner限定词ordinal numeral序数词verbless clause 无动词分句finite verb phrase限定动词词组 possessive pronoun 物主代词gender性main verb 主动词 antecedent先行项subjunctive mood 虚拟式 irregular verb 不规则动词root 词根demonstrative pronoun指示代词semi-auxiliary 半助动词compound complex sentence 并列复杂句passive voice 被动态coordinate construction 并列结构comparative clause 比较分句indefinite pronoun 不定代词 intransitive verb不及物动词vocabulary词汇bound morpheme粘附词素uncountable noun不可数名词morpheme词素central determiner中位限定词indicative mood 陈述式affix 词缀proper noun专有名词 abstract noun 抽象名词phrasal verb 词组动词 notional concord 意义一致原则auxiliary助动词active voice主动态 open class 开放词类linking verb 连系动词 historical present 历史性现在时conjunction 连词 unit noun 单位名词reflexive pronoun 反身代词 second person 第二人称unemphatic use非强调性用法 definite article 定冠词basic clause type分句基本类型 fractional numeral分数词closed class封闭词类 generic reference 类指derivative noun 派生名词 old English古英语complex sentence复杂句 relative clause 关系分句adverb phrase 副词词组 function word 功能词compound word复合词 countable noun 可数名词genitive noun 名词属格 article 冠词notional subject实义主语interjection 感叹词regular plural 规则复数transitive verb 及物动词 past perfective progressive 过去完成进行体mood 语气 implied conditional 含蓄条件句suffix后缀feminine gender阴性collective noun集体名词post-determiner后位限定词 indirect object 间接宾语principle of proximity就近原则 primary auxiliary 基本助动词sentence 句子 concord一致voice 语态common gender通性 question 疑问句base form原形SVOC主—动—宾—补结构imperative mood 祈使式predeterminer前位限定词 inflectional affix 屈折词缀number数voice态 personal pronoun 人称代词double genitive 双重属格 tense 时mood式ditransitive verb双宾语及物动词

语法

1,Leave/fly/come/go /move这些表示位置移动的动词常用现在进行时表将来时。注意与be going to+v-原区分 2,mind doing sth介意做某事 3,spend (time)doing sth花时间做某事。 4,Have great fun doing sth高兴做某事 5,enjoy doing sth喜欢做某事 6,地点副词前面不用介词(there/here/home) 7,say sorry to sb for sth为某事向某人道歉 8,keep sb doing sth让某人一直不停地做某事 9,be sure of sth/sb相信某事、人、be sure to do sth一定会做某事Be sure to do sth务必要做某事。 10小心,当心be careful /watch out /look care/look out 11, had better ( not ) to do sth 12 , help sb (to) do sth/help sb with sth 13, one…..the other一个·····另一个 14其它的other+名词=疑问代词、副词+else 15It takes sb (time) to do sth 16,take sth to sb把某物带给某人 1, look up the word in the dicationary 2, pass sb sth=pass sth to sb 3,thank you sb for doing sth感谢某人做某事 4,good at doing sth擅长与做某事 5,would like to do sth 6, what about doing sth 7,much不能直接修饰形容词或副词的原级,可以修饰比较级;more+多音节adj/adv原级8,must否答needn’t/don’t have to 9,take off脱下take out把······拿出来put on穿上put off推迟 10,may情-v+v-原May be也许是Maybe也许adv修饰v或adj 11, I’d better=I had better I’d like=I would like 12,否定句中some改成any 13, call sb=phone sb=give sb a call=give sb a phone 14,不接触的over the desk在·····上方(垂直) Above the desk在·····上方(斜) 接触的on在······上面 15,through(从中间)穿过 Across(从表面)穿过介词(与动词搭配成为动词) 1,动词cross/pass穿过=go across 2,动名词v-ing 3,到达arrive in/at=get to=reach 4,During在····期间among在·····中间between``````and```在·····之间 5,By+交通工具=on one’s+交通工具 6,Cry哭,哭声sound声音(泛指任何声音)noise吵闹的voice(指人的)说话声

相关文档