在研华的pc104上使用看门狗要使用汇编。使用汇编来修改CMOS里面的参数。也就是内联汇编。

linux下gcc只支持ATT汇编。所以这儿有必要将ATT语法学习学习。以后需要的时候翻出来温习温习。

1,操作数的长度

操作数的长度用加在指令后的符号表示 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

2. 立即数

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

或者:

para = 0x04

movl $para, %ebx

3.寄存器引用

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

80386 有如下寄存器:

8 个 32-bit t通用寄存器 %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 位;

但有的有特殊的用途:AX为累加器,CX为计数器,BX,BP为基址寄存器,SI,DI为变址寄存器,BP还可以是基指针,SP为堆栈指针。

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).

4. 操作数顺序

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

5, 符号常数

符号常数直接引用 如

value: .long 0x12a3f2de

movl value , %ebx

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

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

寄存器 ebx。

6. 内存引用

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)。

1,内联汇编。

两种内联汇编的格式。

一、基本内联汇编的格式是

__asm__ __volatile__("Instruction List");

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

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

规则:

1,这 4 个部分都不是必须的,任何一个部分都可以为空。

2,如 果 Clobber/Modify 为 空 , 则 其 前 面 的 冒 号 (:) 必 须 省 略 。 比 如 __asm__("mov %

%eax, %%ebx" : "=b"(foo) : "a"(inp) : ) 就 是 非 法 的 写 法 ; 而 __asm__("mov %

%eax, %%ebx" : "=b"(foo) : "a"(inp) )则是正确的。

3,"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" )都是错误的写法。

4,区分一个内联汇编是基本格式的还是带有 C/C++表达式格式的,其规则在于在"Instruction List"后

是否有冒号(:)的存在,如果没有则是基本格式的,否则,则是带有 C/C++表达式格式的。

5,ouput:

例子:

intfunc(void)

{

intb =-1;

__asm__ __volatile__(

"movl $2,%%eax"

:"=a"(b));

printf("--------------->%d\n",b);

return0;

}

我们可以很清楚得看到这个输出操作由两部分组成:括号括住 的部分 (b)和引号引

住的部分"=a"。这两部分都是每一个输出操作必不可少的。其中括号里面的是c/c++

表达式,而且只能是左值表达式。而右值来自于引用部分。引号中的内容,被称作

“操作约束”(Operation Constraint),在这个例子中操作约束为"=a",它包含两个约束:

等号(=)和字母 a,其中等号(=)说明括号中左值表达式b是一个 Write-Only 的,只能够

被作为当前内联汇编的输入,而不能作为输入。而字母 a 是寄存器 EAX / AX / AL 的

简写,说明 cr0 的值要从 eax 寄存器中获取,也就是说b = eax。

6,input.

理解了output,再来理解input很容易。

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

括号里面的是c/c++表达式,可以是左值,也可以是右值。

引号里面的是寄存器。寄存器作为左值。

att格式汇编指令_ATT 汇编语法相关推荐

  1. att格式汇编指令_ATT汇编语法简介

    这里,我们介绍三种类型的ATT汇编指令操作数的表示方法,其中指令参考对应体系的指令集(ISA). 第一种类型是立即数(immediate),其书写方式是'$'后面跟一个用标准C表示法表示的整数,比如$ ...

  2. 汇编指令mrs_汇编指令 - Mrs.kang - 博客园

    1.debug的常用命令 1.r命令 查看.修改CPU中寄存器的值 -r :查看寄存器的值 -r  cs :修改寄存器cs的值 2.D命令 查看内存中的内容 1.-d  段地址:偏移地址 -d 100 ...

  3. 指令 机器指令 汇编指令 指令系统 汇编指令的基本构成 操作数

    指令:空值计算机完成特定操作的命令 机器指令:指令的二进制代码形式 汇编指令:指令的助记符形式 指令系统:机器所有指令的集合 8086指令系统:向后兼容,应用广泛 汇编指令的基本构成: 操作码 目的操 ...

  4. att格式汇编指令_ARM汇编伪指令介绍.

    符号定义( Symbol Definition )伪指令 符号定义伪指令用于定义 ARM 汇编程序中的变量.对变量赋值以及定义寄存器的别名等操作. 常见的符号定义伪指令有如下几种: - 用于定义全局变 ...

  5. python汇编指令_Python基础语法

    阅读目录: 第一节:编程基础 第一节:编程基础 第二节:语言分类 第三节:高级语言的发展 第四节:程序program 第五节:Python解释器 第六节:Python基础语法 第七节:程序控制 第八节 ...

  6. arm汇编指令_ARM汇编伪指令介绍.

    符号定义( Symbol Definition )伪指令 符号定义伪指令用于定义 ARM 汇编程序中的变量.对变量赋值以及定义寄存器的别名等操作. 常见的符号定义伪指令有如下几种: - 用于定义全局变 ...

  7. 汇编指令msr_ARM汇编:MRS和MSR指令

    1.MSR和MRS指令介绍 MRS 指令:  对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...

  8. 汇编指令mrs_ARM汇编指令MRS和MSR(转)

    ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据. 针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器.每个位的含义如下图: 分成了4部分: 1,条件标志位 N(Negative) ...

  9. 汇编指令msr_ARM汇编指令MRS和MSR(转)

    ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据. 针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器.每个位的含义如下图: 分成了4部分: 1,条件标志位 N(Negative) ...

最新文章

  1. sublime text3 格式化html代码
  2. 过程作为黑箱抽象——《计算机程序的构造和解释》
  3. RabbitMQ路由模式
  4. python调用钉钉API发送消息
  5. matlab 的均值t检验,用MATLAB做T检验(ttest)
  6. Java虚拟机性能管理神器 - VisualVM(2) 入门
  7. Chipmunk僵尸物理对象的出现和解决(七)
  8. python能开发游戏吗_python可以开发游戏吗,python能开发游戏吗
  9. android中文离线api_比林肯法球Linken sphere浏览器更多更新指纹的国产防关联软件-VMLogin中文版浏览器...
  10. 导出excel数字前面的0消失_EXCEL文本之王TEXT函数的4个运用
  11. Weblogic 数据源及连接池配置问题Warning! Connectivity to backend database not verified
  12. 云智能资深专家崮德:谈谈我对华为HarmonyOS 2.0的看法
  13. 加速新冠疫苗研发,阿里云免费开放一切AI算力!
  14. 用JQuery实现简单计时答题游戏
  15. 论文第一部分写作总结(introduction)
  16. java.util.ConcurrentModificationException when interation the list then remove
  17. Zotero文献同步
  18. Binary Tree Upside Down LC解题记录
  19. matlab printf格式化输出,Shell printf格式化输出命令
  20. php 去掉图片背景透明背景图片,php 处理透明背景的图片时的问题

热门文章

  1. 美国计算机申请转专业先修课,转专业申请需要修读哪些先修课?
  2. 百度2015实习生招聘笔试
  3. 什么是kotlin?
  4. nodejs 打印五彩斑斓的黑
  5. 小孢子:在?我用本地环境pytest带你玩自定义算子
  6. hp电脑java图片抖动_HPPC:高效的Java集合库
  7. 在react工程中使用antd组件时,组件显示语言英文切换的方式
  8. LeetCode算法,每日一题,冲击阿里巴巴,day7
  9. python凯撒加密代码_解密题(凯撒密码)
  10. RTD2172/RTD2171 Type-C转HDMI设计方案|替代RTD2171/RTD2172芯片|GSV2201可完全替代兼容RTD2172/RTD2171