文章分类 -  汇编

摘要:GNU汇编语言结构 主要包括三个常用的段: data 数据段 声明带有初始值的元素 bss 数据段 声明使用0或者null初始化的元素 text 正文段 包含的指令, 每个汇编程序都必须包含此段 使用.section 指令定义段, 如: .section.data .section.bss .section .text 起始点: gnu汇编器使用_start标签表示默认的起始点, 此外如果想要汇编内部的标签能够被外部程序访问, 需要使用.globl指令, 如:.globl_start 使用通用库函数时可以使用: ld -dynamic-linker /lib/ld-linux.so.2#### 阅读全文

posted @ 2013-11-17 12:06 莫扎特也是程序猿 阅读(188) 评论(0) 推荐(0)

摘要:有时候需要在C语言里使用汇编语言,或者是提高性能,或者是因为某些功能不能由系统调用实现。而在内核里,C语言里嵌入汇编是非常普遍的。如何在C语言里嵌入汇编语言呢?intmain(){ __asm____volatile__( "movl%eax,%ebx\n\taddl%eax%ebx\n" ); return0;}使用__asm__宏就可以嵌入汇编,__volatile__指示不让gcc优化下面的汇编代码。 .file"gccasm.c" .text .globlmain .typemain,@functionmain: pushl%ebp movl%e 阅读全文

posted @ 2013-10-16 12:50 莫扎特也是程序猿 阅读(294) 评论(0) 推荐(0)

摘要:一:nasm源文件布局:像其他汇编器一样, nasm源文件包含四个域的组合。(除了宏, 或者预编译器指示, 或者汇编指示 )label标号: 指令 操作数 ;注释通常, 这些域是可选的。 当然, 操作数域是根据指令的要求来放置,或者去掉的。nasm使用/作为行链接符, 如果一行以/结尾, 下一行认为是本行的继续.nasm对于空格没有限制; 标号可以在前面包含空格, 或者指令前可以没有空格. 标号后的冒号是可选的. (可以使用-w+orphan-label选项来提示某行只有标号).标号中的字符包括字母, 数字, _$#@~.? 可以字母开头, . (.有特殊的含义!), _和? 也可以作为头部. 阅读全文

posted @ 2013-09-28 11:53 莫扎特也是程序猿 阅读(3144) 评论(0) 推荐(0)

摘要:格式:可有三种 MOVS DST,SRC MOVS(字节) MOVSW(字) 其中第二,三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如: MOVS ES:BYTE PTR[DI],DS:[SI] 实际上MOVS的寻址方式是隐含的(这在下面所招待的操作中可以看到),所以这种格式中的DST及SRC只提供给汇编程序作类型检查用,并且不允许用其他寻址方式来确定操作数。 执行的操作: 1) ((DI))←((SI)) 2) 字节操作: (SI)←(SI)±1,(DI)←(DI)±1 当方向标志DF... 阅读全文

posted @ 2013-09-23 21:58 莫扎特也是程序猿 阅读(13025) 评论(0) 推荐(1)

摘要:对于MOV这个传送指令 有7点规定:1. 两个操作数的数据类型一定要相同,源操作数是8位那么目的操作数也得是8位的。以此类推 16位 32位也一样。例如:movEAX,EAX//正确的movEAX,AX//错误的2.两个操作数不可以同时为段寄存器 ,例如: MOVES,DS//错误的3.代码段寄存器CS 不能作为 目的操作数,但可以作为 源操作数使用。例如:MOVCS,AX// 错误的MOVAX,CS//正确的4.立即数不可以直接传给段寄存器,例如:MOVDS,100H//错误的5.立即数也不能作为目的操作数,例如:MOV 100H,AX// 错误的6.指令指针 IP 寄存器 不可以做为 MO 阅读全文

posted @ 2013-09-23 21:37 莫扎特也是程序猿 阅读(2538) 评论(0) 推荐(0)

导航