《AT_T汇编语言格式》由会员分享,可在线阅读,更多相关《AT_T汇编语言格式(29页珍藏版)》请在金锄头文库上搜索。
1、 转载) 开发一个 管绝大部分代码只需要用 C/C+等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限制,使用精练的汇编可以缩小目标代码的 外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能。所以我们必须了解汇编语言,即使你有可能并不喜欢它。 如果你是计算机专业的话,在大学里你应该学习过 式的 8086/80386 汇编,这里就不再讨论。如果我们选择的 发工具是 及 话,就必须了解 汇编语言语法,因为 支持这种汇编语法。 本书不会去讨论 8086/80386 的汇编编程,这类的书籍很多,你可以参考它们。这里只会讨论 的汇编语法,以及 内嵌汇
2、编语法。 引用寄存器要在寄存器号前加百分号 %,如“ % 80386 有如下寄存器: 8 个 32存器 % 8 个 16存器,它们事实上是上面 8 个 32存器的低 16 位: % 8 个 8存器: %们事实上是寄存器 %高 8 位和低 8 位; 6 个段寄存器: %cs( %ds( %ss( % 3 个控制寄存器: % 6 个 存器: % 2 个测试寄存器: % 8 个浮点寄存器栈: %), %), %), %), %), %), %), %)。 2. 操作数顺序 操作数排列是从源(左)到目的(右),如“ ) , %的)” 3. 立即数 使用立即数,要在数前面加符号 $, 如“ 0% 或者:
3、 0%令执行的结果是将立即数 04h 装入寄存器 4. 符号常数 符号常数直接引用 如 %令执行的结果是将常数 0入寄存器 引用符号地址在符号前加符号 $, 如“ % 是将符号 地址装入寄存器 5. 操作数的长度 操作数的长度用加在指令后的符号表示 b(8 w(16 l(32如“ %“ %“ %。 如果没有指定操作数长度的话, 编译器将按照目标操作数的长度来设置。 比如指令 “ %, 由于目标操作数 长度为 那么编译器将把此指令等同于 “ %。同样道理,指令“ 4, %同于指令“ 4, % “ 同于“ 对于没有指定操作数长度,但编译器又无法猜测的指令,编译器将会报错,比如指令“ 4”。 6.
4、符号扩展和零扩展指令 绝大多数面向 80386 的 汇编指令与 式的汇编指令都是相同的,符号扩展指令和零扩展指令则是仅有的不同格式指令。 符号扩展指令和零扩展指令需要指定源操作数长度和目的操作数长度, 即使在某些指令中这些操作数是隐含的。 在 语法中,符号扩展和零扩展指令的格式为,基本部分 对应 后面跟上源操作数长度和目的操作数长度。 味着 味着 味着 于 令也一样。比如指令“ %味着将 存器的内容进行符号扩展后放置到 存器中。 其它的 式的符号扩展指令还有: - al to - ax to - ax to - to 对应的 语法的指令为 7. 调用和跳转指令 段内调用和跳转指令为 段间调用和
5、跳转指令为 段间调用和跳转指令的格式为 “ $, 而段间返回指令则为 “ 8. 前缀 操作码前缀被用在下列的情况: 字符串重复操作指令 ( 指定被操作的段 (cs,ds,ss,es,fs, 进行总线加锁 ( 指定地址和操作的大小 ( 在 汇编语法中,操作码前缀通常被单独放在一行,后面不跟任何操作数。例如,对于重复 令,其写法为: 述操作码前缀的意义和用法如下: 指定被操作的段前缀为 cs,ds,ss,es, 语法中,只需要按照格式就指定了相应的段前缀。比如:cs: 操作数地址大小前缀是“ 它们被用来在 32作数地址代码中指定 16操作数地址。 总线加锁前缀“ ,它是为了在多处理器环境中,保证在
6、当前指令执行期间禁止一切中断。 这个前缀仅仅对 令有效,如果将 缀用在其它指令之前,将会引起异常。 字符串重复操作前缀 来让字符串操作重复“ %。 9. 内存引用 法的间接内存引用的格式为: 而在 语法中对应的形式为: 其中, 任意的 32 存器。 以取值 1, 2, 4, 8。如果不指定 ,则默认值为 1。 以指定任意的段寄存器作为段前缀,默认的段寄存器在不同的情况下不一样。如果你在指令中指定了默认的段前缀,则编译器在目标代码中不会产生此段前缀代码。 下面是一些例子: 4, 有指定,由于 %以默认的有指定,则 0。 %): , 它域没有指定。这里默认的 1):这个表达式引用的是指针 向的地址
7、所存放的值。注意这个表达式中没有 且只有一个逗号,这是一种异常语法,但却合法。 %gs:个表达式引用的是放置于 %里变量 值。 如果 作在操作数前指定前缀“ *”,则表示是一个绝对地址调用 /跳转,也就是说 令指定的是一个绝对地址。如果没有指定 *,则操作数是一个相对地址。 任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸 (也就是说必须带有指令后缀 (b,w,l)。 持在 C/C+代码中嵌入汇编代码,这些汇编代码被称作 联汇编。这是一个非常有用的功能,有利于我们将一些 C/C+语法无法表达的指令直接潜入C/C+代码中,另外也允许我们直接写 C/C+代码中使用汇编编写简洁高效的代
8、码。 基本的内联汇编非常易懂,我们先来看两个简单的例子: _; / 看起来很熟悉吧! 或者是 _ 1,%,%0); 或 _1,%r t r t 0 ); 基本内联汇编的格式是 _; 1、 _键字 宏定义: #_来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。 2、 汇编指令序列。它可以是空的,比如: _); 或_);都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有 空的内联汇编表达式都是没有意义的,比如: _:; 就非常有意义,它向 明:“我对内存作了改动”, 编译的时候,会将此因素考虑进去。 我们看一看下面这个例子: $ c _) _p = (_ (*_p)