首页 ATT汇编语法

ATT汇编语法

举报
开通vip

ATT汇编语法ATT汇编语法 在研华的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 ”。 如果没有指定操作数长度的话,编译...

ATT汇编语法
ATT汇编语法 在研华的pc104上使用看门狗要使用汇编。使用汇编来修改CMOS里面的参数。也就是内联汇编。 linux下gcc只支持ATT汇编。所以这儿有必要将ATT语法学习学习。以后需要的时候翻出来温习温习。 1,操作数的长度 操作数的长度用加在指令后的符号 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示 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 , %ebx”等同于指令“movl , %ebx”,“push %al” 等同于“pushb %al”。对于没有指定操作数长度,但编译器又无法猜测的指令,编 译器将会报错,比如指令“push 2. 立即数 使用立即数,要在数前面加符号$, 如“movl [message]x04, %ebx” 或者: para = 0x04 movl $para, %ebx 3.寄存器引用 引用寄存器要在寄存器号前加百分号%,如“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). 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: 例子: int func(void) { int b = -1; __asm__ __volatile__( "movl ,%%eax" :"=a"(b) ); printf("--------------->%d\n",b); return 0; } 我们可以很清楚得看到这个输出操作由两部分组成:括号括住 的部分 (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汇编语法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_562397
暂无简介~
格式:doc
大小:19KB
软件:Word
页数:5
分类:生活休闲
上传时间:2017-11-08
浏览量:71