当前位置: 首页 > news >正文

怎样建立网站目录结构网页设计案例代码

怎样建立网站目录结构,网页设计案例代码,cms网站管理,专业网站建设企业网站制作http://blog.sina.com.cn/s/blog_59b189220100au1k.html 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C编写程序很方便#xff0c;但汇编源程序用于系统最基本的初始化#xff0c;如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行…http://blog.sina.com.cn/s/blog_59b189220100au1k.html 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C编写程序很方便但汇编源程序用于系统最基本的初始化如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是GNU的汇编器遵循ATT的汇编语法可以从GNU的站点www.gnu.org上下载有关规范。一. Linux汇编行结构任何汇编行都是如下结构[:] [} comment[:] [} 注释Linux ARM 汇编中任何以冒号结尾的标识符都被认为是一个标号而不一定非要在一行的开始。【例1】定义一个add的函数返回两个参数的和。.section .text, “x”.global add give the symbol add external linkageadd:ADD r0, r0, r1 add input argumentsMOV pc, lr return from subroutine end of program二. Linux 汇编程序中的标号标号只能由azAZ09“.”_等字符组成。当标号为09的数字时为局部标号局部标号可以重复出现,使用方法如下标号f: 在引用的地方向前的标号标号b: 在引用的地方向后的标号【例2】使用局部符号的例子一段循环程序1:  subs r0,r0,#1 每次循环使r0r0-1  bne 1f 跳转到1标号去执行局部标号代表它所在的地址,因此也可以当作变量或者函数来使用。三. Linux汇编程序中的分段1.section伪操作用户可以通过.section伪操作来自定义一个段,格式如下: .section section_name [, flags[, %type[,flag_specific_arguments]]]每一个段以段名为开始, 以下一个段名或者文件结尾为结束。这些段都有缺省的标志flags,连接器可以识别这些标志。(与armasm中的AREA相同)。下面是ELF格式允许的段标志标志 含义a 允许段w 可写段x 执行段【例3】定义段 .section .mysection 自定义数据段段名为 “.mysection” .align 2 strtemp: .ascii Temp string \n\02汇编系统预定义的段名.text 代码段.data 初始化数据段.bss 未初始化数据段.sdata .sbss 需要注意的是源程序中.bss段应该在.text之前。四. 定义入口点汇编程序的缺省入口是 start标号用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。【例4】定义入口点.section.data initialized data here.section .bss uninitialized data here.section .text.globl _start_start:instruction code goes here五. Linux汇编程序中的宏定义格式如下: .macro 宏名 参数名列表 伪指令.macro定义一个宏  宏体 .endm .endm表示宏结束如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”。宏定义时的参数还可以使用默认值。可以使用.exitm伪指令来退出宏。【例5】宏定义.macro SHIFTLEFT a, b.if \b 0MOV \a, \a, ASR #-\b.exitm.endifMOV \a, \a, LSL #\b.endm六. Linux汇编程序中的常数1十进制数以非0数字开头,如:123和98762二进制数以0b开头,其中字母也可以为大写3八进制数以0开始,如:0456,01234十六进制数以0x开头,如:0xabcd,0X123f5字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!\n”6当前地址以“.”表示,在汇编程序中可以使用这个符号代表当前指令的地址7表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“”表示不相等,其他的符号如:、-、*、 /、%、、、、、|、、^、!、、、、、|| 跟C语言中的用法相似。七. Linux下ARM汇编的常用伪操作在前面已经提到过了一些为操作还有下面一些为操作数据定义伪操作 .byte.short.long.quad.float.string/.asciz/.ascii重复定义伪操作.rept赋值语句.equ/.set  函数的定义  对齐方式伪操作 .align 源文件结束伪操作.end.include伪操作 if伪操作 .global/ .globl 伪操作 .type伪操作 列表控制语句 区别于gas汇编的通用伪操作,下面是ARM特有的伪操作 .reg .unreq .code .thumb .thumb_func .thumb_set .ltorg .pool1. 数据定义伪操作1 .byte:单字节定义如.byte 1,2,0b01,0x34,072,s 2 .short:定义双字节数据如:.short 0x1234,60000 3 .long:定义4字节数据如:.long 0x12345678,238765654 .quad:定义8字节如:.quad 0x1234567890abcd5 .float定义浮点数如:  .float 0f-314159265358979323846264338327\  95028841971.693993751E-40 - pi6 .string/.asciz/.ascii定义多个字符串如:  .string abcd, efgh, hello!  .asciz qwer, sun, world!  .ascii welcome\0需要注意的是.ascii伪操作定义的字符串需要自行添加结尾字符\0。7 .rept:重复定义伪操作, 格式如下:  .rept 重复次数  数据定义  .endr 结束重复定义  例如:  .rept 3  .byte 0x23  .endr8 .equ/.set: 赋值语句, 格式如下:  .equ(.set) 变量名,表达式  例如:  .equ abc 3 让abc32.函数的定义伪操作1函数的定义,格式如下:  函数名:  函数体  返回语句一般的,函数如果需要在其他文件中调用, 需要用到.global伪操作将函数声明为全局函数。为了不至于在其他程序在调用某个C函数时发生混乱,对寄存器的使用我们需要遵循APCS准则。函数编译器将处理为函数代码为一段.global的汇编码。2函数的编写应当遵循如下规则: a1-a4寄存器参数、结果或暂存寄存器r0到r3 的同义字以及浮点寄存器f0-f3(如果存在浮点协处理器)在函数中是不必保存的 如果函数返回一个不大于一个字大小的值则在函数结束时应该把这个值送到 r0 中 如果函数返回一个浮点数则在函数结束时把它放入浮点寄存器f0中 如果函数的过程改动了sp堆栈指针r13、fp框架指针r11、sl堆栈限制r10、lr连接寄存器r14、v1-v8变量寄存器r4 到 r11和 f4-f7,那么函数结束时这些寄存器应当被恢复为包含在进入函数时它所持有的值。3. .align .end .include .incbin伪操作1.align:用来指定数据的对齐方式,格式如下:  .align [absexpr1, absexpr2]  以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或 32. 第二个表达式值表示填充的值。2.end:表明源文件的结束。3.include:可以将指定的文件在使用.include 的地方展开,一般是头文件,例如:  .include “myarmasm.h”4.incbin伪操作可以将原封不动的一个二进制文件编译到当前文件中,使用方法如下:  .incbin file[,skip[,count]]  skip表明是从文件开始跳过skip个字节开始读取文件,count是读取的字数.4. .if伪操作根据一个表达式的值来决定是否要编译下面的代码, 用.endif伪操作来表示条件判断的结束, 中间可以使用.else来决定.if的条件不满足的情况下应该编译哪一部分代码。.if有多个变种: .ifdef symbol 判断symbol是否定义 .ifc string1,string2 字符串string1和string2是否相等,字符串可以用单引号括起来 .ifeq expression 判断expression的值是否为0.ifeqs string1,string2 判断string1和string2是否相等,字符 串必须用双引号括起来.ifge expression 判断expression的值是否大于等于0.ifgt absolute expression 判断expression的值是否大于0.ifle expression 判断expression的值是否小于等于0.iflt absolute expression 判断expression的值是否小于0.ifnc string1,string2 判断string1和string2是否不相等, 其用法跟.ifc恰好相反。.ifndef symbol, .ifnotdef symbol 判断是否没有定义symbol, 跟.ifdef恰好相反.ifne expression 如果expression的值不是0, 那么编译器将编译下面的代码.ifnes string1,string2 如果字符串string1和string2不相 等, 那么编译器将编译下面的代码.5. .global .type .title .list1.global/ .globl 用来定义一个全局的符号格式如下:  .global symbol 或者 .globl symbol2.type用来指定一个符号的类型是函数类型或者是对象类型, 对象类型一般是数据, 格式如下:  .type 符号, 类型描述【例6】.globl a.data.align 4.type a, object.size a, 4a:.long 10【例7】.section .text.type asmfunc, function.globl asmfuncasmfunc:mov pc, lr3列表控制语句:.title用来指定汇编列表的标题,例如:  .title “my program”.list用来输出列表文件.6. ARM特有的伪操作1 .reg: 用来给寄存器赋予别名,格式如下:  别名 .req 寄存器名2 .unreq: 用来取消一个寄存器的别名,格式如下:       .unreq 寄存器别名  注意被取消的别名必须事先定义过,否则编译器就会报错,这个伪操作也可以用来取消系统预制的别名, 例如r0, 但如果没有必要的话不推荐那样做。3 .code伪操作用来选择ARM或者Thumb指令集,格式如下:           .code 表达式  如果表达式的值为16则表明下面的指令为Thumb指令,如果表达式的值为32则表明下面的指令为ARM指令.4 .thumb伪操作等同于.code 16, 表明使用Thumb指令, 类似的.arm等同于.code 325 .force_thumb伪操作用来强制目标处理器选择thumb的指令集而不管处理器是否支持6 .thumb_func伪操作用来指明一个函数是thumb指令集的函数7 .thumb_set伪操作的作用类似于.set, 可以用来给一个标志起一个别名, 比.set功能增加的一点是可以把一个标志标记为thumb函数的入口, 这点功能等同于.thumb_func8 .ltorg用于声明一个数据缓冲池(literal pool)的开始,它可以分配很大的空间。9 .pool的作用等同.ltorg9.space number_of_bytes {,fill_byte}分配number_of_bytes字节的数据空间并填充其值为fill_byte若未指定该值缺省填充0。与armasm中的SPACE功能相同10.word word1 {,word2} …插入一个32-bit的数据队列。与armasm中的DCD功能相同可以使用.word把标识符作为常量使用 例如  Start:  valueOfStart:  .word Start 这样程序的开头Start便被存入了内存变量valueOfStart中。11.hword short1 {,short2} …插入一个16-bit的数据队列。与armasm中的DCW相同八. GNU ARM汇编特殊字符和语法代码行中的注释符号: ‘’整行注释符号: ‘#’语句分离符号: ‘;’直接操作数前缀: ‘#’ 或 ‘$’第二部分 GNU的编译器和调试工具一. 编译工具1编辑工具介绍GNU 提供的编译工具包括汇编器as、C编译器gcc、C编译器g、连接器ld和二进制转换工具objcopy。基于ARM平台的工具分别为arm- linux-as、arm-linux-gcc、arm-linux-g、arm-linux-ld和arm-linux- objcopy。GNU的编译器功能非常强大共有上百个操作选项这也是这类工具让初学者头痛的原因。不过实际开发中只需要用到有限的几个大部分可以采用缺省选项。GNU工具的开发流程如下编写C、C语言或汇编源程序用gcc或g生成目标文件编写连接脚本文件用连接器生成最终目标文件elf格式用二进制转换工具生成可下载的二进制代码。1编写C、C语言或汇编源程序通常汇编源程序用于系统最基本的初始化如初始化堆栈指针、设置页表、操作ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是GNU的汇编器遵循ATT的汇编语法读者可以从GNU的站点www.gnu.org上下载有关规范。汇编程序的缺省入口是 start标号用户也可以在连接脚本文件中用ENTRY标志指明其它入口点见下文关于连接脚本的说明。2用gcc或g生成目标文件如果应用程序包括多个文件就需要进行分别编译最后用连接器连接起来。如笔者的引导程序包括3个文件init.s汇编代码、初始化硬件xmrecever.c通信模块采用Xmode协议和flash.cFlash擦写模块。分别用如下命令生成目标文件 arm-linux-gcc-c-O2-oinit.oinit.s arm-linux-gcc-c-O2-oxmrecever.oxmrecever.c arm-linux-gcc-c-O2-oflash.oflash.c 其中-c命令表示只生成目标代码不进行连接-o命令指明目标文件的名称-O2表示采用二级优化采用优化后可使生成的代码更短运行速度更快。如果项目包含很多文件则需要编写makefile文件。关于makefile的内容请感兴趣的读者参考相关资料。3编写连接脚本文件gcc 等编译器内置有缺省的连接脚本。如果采用缺省脚本则生成的目标代码需要操作系统才能加载运行。为了能在嵌入式系统上直接运行需要编写自己的连接脚本文件。编写连接脚本首先要对目标文件的格式有一定了解。GNU编译器生成的目标文件缺省为elf格式。elf文件由若干段section组成如不特殊指明由C源程序生成的目标代码中包含如下段.text正文段包含程序的指令代码.data(数据段)包含固定的数据如常量、字符串.bss未初始化数据段包含未初始化的变量、数组等。C源程序生成的目标代码中还包括.fini析构函数代码和. init构造函数代码等。连接器的任务就是将多个目标文件的.text、.data和.bss等段连接在一起而连接脚本文件是告诉连接器从什么地址开始放置这些段。例如连接文件link.lds为ENTRY(begin)SECTION{.0x30000000;.text:{*(.text)}.data:{*(.data)}.bss:{*(.bss)}}其中ENTRY(begin)指明程序的入口点为begin标号.0x00300000指明目标代码的起始地址为0x30000000这一段地址为 MX1的片内RAM.text:{*(.text)}表示从0x30000000开始放置所有目标文件的代码段随后的.data:{* (.data)}表示数据段从代码段的末尾开始再后是.bss段。4用连接器生成最终目标文件有了连接脚本文件如下命令可生成最终的目标文件arm-linux-ld –no stadlib –o bootstrap.elf -Tlink.lds init.o xmrecever.o flash.o其中ostadlib表示不连接系统的运行库而是直接从begin入口-o指明目标文件的名称-T指明采用的连接脚本文件也可以使用-Ttext addressaddress表示执行区地址最后是需要连接的目标文件列表。5生成二进制代码连接生成的elf文件还不能直接下载执行通过objcopy工具可生成最终的二进制文件arm-linux-objcopy –O binary bootstrap.elf bootstrap.bin其中-O binary指定生成为二进制格式文件。Objcopy还可以生成S格式的文件只需将参数换成-O srec。还可以使用-S选项移除所有的符号信息及重定位信息。如果想将生成的目标代码反汇编还可以用objdump工具 arm-linux-objdump -D bootstrap.elf至此所生成的目标文件就可以直接写入Flash中运行了。2Makefile实例example: head.s main.c arm-linux-gcc -c -o head.o head.s arm-linux-gcc -c -o main.o main.c arm-linux-ld -Tlink.lds head.o ain.o -o example.elf arm-linux-objcopy -O binary -S example_tmp.o example arm-linux-objdump -D -b binary -m arm example ttt.s二. 调试工具Linux 下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux下应用程序的远程调试。 gdbserver是一个很小的应用程序运行于目标板上可监控被调试进程的运行并通过串口与上位机上的gdb通信。开发者可以通过上位机的gdb输入命令控制目标板上进程的运行查看内存和寄存器的内容。gdb5.1.1以后的版本加入了对ARM处理器的支持在初始化时加入 targetarm参数可直接生成基于ARM平台的gdbserver。gdb工具可以从ftp: //ftp.gnu.org/pub/gnu/gdb/上下载。对于Linux内核的调试可以采用kgdb工具同样需要通过串口与上位机上的gdb通信对目标板的Linux内核进行调试。可以从http://oss.sgi.com/projects/kgdb/上了解具体的使用方法。参考资料1. Richard BlumProfessional Assembly Language2. GNU ARM 汇编快速入门http://blog.chinaunix.net/u/31996/showart.php?id3261463. ARM GNU 汇编伪指令简介http://www.cppblog.com/jb8164/archive/2008/01/22/41661.aspx4. GNU汇编使用经验http://blog.chinaunix.net/u1/37614/showart_390095.html5. GNU的编译器和开发工具http://blog.ccidnet.com/blog-htm-do-showone-uid-34335-itemid-81387-type-blog.html6. 用GNU工具开发基于ARM的嵌入式系统http://blog.163.com/liren0126/blog/static/32897598200821211144696/7. objcopy命令介绍http://blog.csdn.net/junhua198310/archive/2007/06/27/1669545.aspx   ADS汇编和Gnu汇编的转换转自http://zhangwenxin82.blog.163.com/blog/static/1145959562009324111541596/ ADS汇编格式转自http://blog.csdn.net/jiacky/archive/2009/06/05/4245087.aspx 将ARM ADS下的汇编码移植到GCC for ARM编译器时有如下规则 1, 注释行以或代替; 2, GET或INCLUDE .INCLUDE如get option.a      .include option.a 3, EQU .equTCLK2   EQU   PB25             .equ   TCLK2, PB25     SETA .equ     SETL .equ BUSWIDTH SETA 16    .equ BUSWIDTH, 16 4, EXPORT .global     IMPORT .extern     GBLL .global     GBLA .global 5, DCD .long 6, IF :DEF: .IFDEF     ELSE .ELSE     ENDIF .ENDIF     :OR:     |     :SHL:           7,   END    .endNOTE:在被include的头文件中如option.a中不再需要.end否则会导致主汇编程序结束。 8,   符号定义加号Entry     Entry:AREA Word, CODE, READONLY .textAREA Block, DATA, READWRITE .dataCODE32      .armCODE16      .thumb 9,   MACRO    .macro     MEND    .endm
http://www.huolong8.cn/news/57365/

相关文章:

  • 坪山网站建设特色设计公司logo的网站
  • 自己做视频的网站wordpress 加链接
  • 济南优化seo网站建设鞍山网上推广怎么弄?
  • 网站建设源码是什么WordPress如何制作友情链接
  • 公司网站制作计入什么科目营销网站建设一薇
  • 网站关键词代码标志设计logo网站
  • flash个人网站模板西安网站开发公司排名
  • 济南网站开发公司排名怎么做租房网站
  • 文明网站机制建设围场网站建设
  • 长沙网站建设1681989简述seo的优势
  • 南阳网站排名公司结构设计师之家官网
  • 网站开发技术技巧哈尔滨网站建设美丽
  • 网站备案幕布尺寸论坛类的网站怎么做
  • 个人免费自助建站平湖公司做网站
  • 推广网站文案素材网络下载的网站模板能直接上传到虚拟主机
  • 瀑布流网站网络营销是什么的具体应用
  • 汽车制造行业网站模板国内最好的效果图公司
  • 免费网站大全app成都知名网站建设公司
  • 网站建设实训心得php做网站软件定制开发
  • 女生做网站编辑好吗加强网站队伍建设
  • 网站维护和网页维护区别商标自助查询系统官网
  • 网站建设pqiw中装建设股票
  • 建设网站是公司资产怎么介绍自己做的网站效果图
  • 惠州酒店网站建设如何用网站设计制作
  • 电白网站开发公司作文大全网站链接
  • 做网站的公司 苏迪石家庄 外贸网站建设公司
  • 企业网站开源系统销售管理软件有哪些
  • 自己做网站还能挣钱吗湘潭网站建设方案费用
  • 推荐个在广州做网站的网站建设推广文章
  • 用什么网站做pptfullpage网站怎么做