LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1111|回复: 5

这些天在学汇编,给点见意吧

[复制链接]
发表于 2003-6-16 23:53:02 | 显示全部楼层 |阅读模式
我们上课学的是intel的汇编,
但是在linux下好像说是只有AT&T的汇编,
这怎么学啊?
还有就是可以装个dos  吗,grub怎么配置呢?
还有怎么查看自己的寄存器和指令集啊?
哎呀,问题太多了,
发表于 2003-6-17 09:03:37 | 显示全部楼层
转贴

AT&T的汇编语言语法格式   
我想我们大部分人对Intel格式的汇编语言都很了解了。但是,在   
Linux核心代码中,所有的汇编语言指令都是用AT&T格式的汇编语   
言书写的。这两种汇编语言在语法格式上有着很大的不同:   

1.在AT&T的汇编语言中,用'$'前缀表示一个立即操作数;而在Intel   
的格式中,立即操作数的表示不带任何前缀符。例如:下面两个语句   
是完全相同的:   
*AT&T:  pushl  $4   
*Intel:  push  4   

2.AT&T和Intel的汇编语言格式中,源操作数和目标操作数的位置正   
好相反。Intel的汇编语言中,目标操作数在源操作数的左边;而在   
AT&T的汇编语言中,目标操作数则在源操作数的右边。例如:   
*AT&T  :  addl  $4,%eax   
*Intel:  add  eax,4   

3.在AT&T的汇编语言中,操作数的字长是由操作码助记符的最后一个   
字母决定的,后缀'b'、'w'、'l'分别表示操作数的字长为8比特(字   
节,byte),16比特(字,word)和32比特(长字,long),而   
Intel格式中操作数的字长是用“word  ptr”或者“byte  ptr”等前   
缀来表示的。例如:   
*AT&T:  movb  FOO,%al   
*Intel:  mov  al,byte  ptr  FOO   

4.在AT&T汇编指令中,直接远跳转/调用的指令格式是“lcall/ljmp   
$SECTION,$OFFSET”,同样,远程返回的指令是“lret   
$STACK-ADJUST”;而在Intel格式中,相应的指令分别为“call/jmp   
far  SECTION:OFFSET”和“ret  far  STACK-ADJUST”。   

①AT&T汇编指令操作助记符命名规则   
AT&T汇编语言中,操作码助记符的后缀字符指定了该指令中操作数的   
字长。后缀字母'b'、'w'、'l'分别表示字长为8比特(字节,byte),   
16比特(字,word)和32比特(长字,long)的操作数。如果助记符   
中没有指定字长后缀并且该指令中没有内存操作数,汇编程序'as'会   
根据指令中指定的寄存器操作数补上相应的后缀字符。所以,下面的   
两个指令具有相同的效果(这只是GNU的汇编程序as的一个特性,AT&T   
的Unix汇编程序将没有字长后缀的指令的操作数字长假设为32比特):   

mov  %ax,%bx   

movw  %ax,%bx   

AT&T中几乎所有的操作助记符与Intel格式中的助记符同名,仅有一   
小部分例外。操作数扩展指令就是例外之一。在AT&T汇编指令中,操   
作数扩展指令有两个后缀:一个指定源操作数的字长,另一个指定目   
标操作数的字长。AT&T的符号扩展指令的基本助记符为'movs',零扩   
展指令的基本助记符为'movz'(相应的Intel指令为'movsx'和   
'movzx')。因此,'movsbl  %al,%edx'表示对寄存器al中的字节数据   
进行字节到长字的符号扩展,计算结果存放在寄存器edx中。下面是一   
些允许的操作数扩展后缀:   
*bl:  字节->长字   
*bw:  字节->字   
*wl:  字->长字   
还有一些其他的类型转换指令的对应关系:   

*Intel  *AT&T   
⑴  cbw  cbtw   
符号扩展:al->ax   
⑵  cwde  cwtl   
符号扩展:ax->eax   
⑶  cwd  cwtd   
符号扩展:ax->dx:ax   
⑷  cdq  cltd   
符号扩展:eax->edx:eax   

还有一个不同名的助记符就是远程跳转/调用指令。在Intel格式中,   
远程跳转/调用指令的助记符为“call/jmp  far”,而在AT&T的汇编   
语言中,相应的指令为“lcall”和“ljmp”。   

②AT&T中寄存器的命名   
在AT&T汇编语言中,寄存器操作数总是以'%'作为前缀。80386芯片的   
寄存器包括:   
⑴8个32位寄存器:'%eax','%ebx','%ecx','%edx','%edi','%esi',   
'%ebp','%esp'   
⑵8个16位寄存器:'%ax','%bx','%cx','%dx','%si','%di','%bp',   
'%sp'   
⑶8个8位寄存器:'%ah','%al','%bh','%bl','%ch','%cl','%dh',   
'%dl'   
⑷6个段寄存器:'%cs','%ds','%es','%ss','%fs','%gs'   
⑸3个控制寄存器:'%cr0','%cr1','%cr2'   
⑹6个调试寄存器:'%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)'   

*注:我对这些寄存器并不是都了解,这些资料只是摘自as.info文档。   
如果真的需要寄存器命名的资料,我想可以参考一下相应GNU工具的机   
器描述方面的源文件。   

③AT&T中的操作码前缀   
⑴段超越前缀'cs','ds','es','ss','fs','gs':当汇编程序中对内   
存操作数进行SECTION:MEMORY-OPERAND引用时,自动加上相应的段超   
越前缀。   
⑵操作数/地址尺寸前缀'data16','addr16':这些前缀将32位的操作   
数/地址转化为16位的操作数/地址。   
⑶总线锁定前缀'lock':总线锁定操作。'lock'前缀在Linux核心代码   
中使用很多,特别是SMP代码中。   
⑷协处理器等待前缀'wait':等待协处理器完成当前操作。   
⑸指令重复前缀'rep','repe','repne':在串操作中重复指令的执行。   

④AT&T中的内存操作数   
在Intel的汇编语言中,内存操作数引用的格式如下:   

SECTION:[BASE  +  INDEX*SCALE  +  DISP]   
而在AT&T的汇编语言中,内存操作数的应用格式则是这样的:   

SECTIONISP(BASE,INDEX,SCALE)   

下面是一些内存操作数的例子:   

*AT&T  *Intel   
⑴  -4(%ebp)  [ebp-4]   
⑵  foo(,%eax,4)  [foo+eax*4]   
⑶  foo(,1)  [foo]   
⑷  %gs:foo  gs:foo   

还有,绝对跳转/调用指令中的内存操作数必须以'*'最为前缀,否则   
as总是假设这是一个相对跳转/调用指令。   

⑤AT&T中的跳转指令   
as汇编程序自动对跳转指令进行优化,总是使用尽可能小的跳转偏移   
量。如果8比特的偏移量无法满足要求的话,as会使用一个32位的偏   
移量,as汇编程序暂时还不支持16位的跳转偏移量,所以对跳转指令   
使用'addr16'前缀是无效的。   

还有一些跳转指令只支持8位的跳转偏移量,这些指令包括:'jcxz',   
'jecxz','loop','loopz','loope','loopnz'和'loopne'。所以,   
在as的汇编源程序中使用这些指令可能会出错。(幸运的是,gcc并   
不使用这些指令)   

对AT&T汇编语言语法的简单介绍差不多了,其中有些特性是as特有的。   
在Linux核心代码中,并不涉及到所有上面这些提到的语法规则,其   
中有两点规则特别重要:第一,as中对寄存器引用时使用前缀'%';第   
二,AT&T汇编语言中源操作数和目标操作数的位置与我们熟悉的Intel   
的语法正好相反。
发表于 2003-6-24 16:27:18 | 显示全部楼层

Nasm can meet with your demand .

Nasm is a .asm compiler with INTEL style.
发表于 2003-7-3 17:26:58 | 显示全部楼层
可以搞个freedos玩玩:)
发表于 2003-7-3 22:42:19 | 显示全部楼层
这么说,是不是在Linux下学汇编,仍然可以用Intel的书。

只要注意上面的那些区别就可以了。
发表于 2003-7-3 22:46:11 | 显示全部楼层
机器码是一样的,虽然指令助记符和语法不同,编程的道理是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表