RSEG用法和汇编问号的涵义.pdfVIP

  • 26
  • 0
  • 约1.75千字
  • 约 2页
  • 2015-07-22 发布于河北
  • 举报
汇编语言段和 RSEG 用法 2012-04-10 10:12 81 人阅读 评论(0) 收藏 举报 RSEG 是段选择指令,要想明白它的意思就要了解段的意思。 段是程序代码或数据对象的存储单位。程序代码放到代码段,数据对象放到数据段。段分两 种,一是绝对段,一是再定位段。绝对段在汇编语言中指定,在用L51 联接的时候,地址 不会改变。用于如访问一个固定存储器的i/o,或提供中断向量的入口地址。而再定位段的地 址是浮动的。它的地址有L51 对程序模块连接时决定,C51 对源程序编译所产生的段都是再 定位段,它都有段名和存储类型。绝对段没有段名。 说了这么多,大家可能还是不明白段是什么意思。别急,接着往下看。 例如,你写用C 写了一个函数 void test_fun(void) { …} , 存在test.c 中,用编译器编译以 后. SRC FILE 中看到: ?PR?test_fun?TEST SEGMENT CODE //(函数放到代码段中) 写这个函数体的时候: RSEG ?PR?test_fun?TEST //选择已定位的代码段为当前段 test_fun: ……//代码 所以函数的表达模式是这样: ?PR?函数名?文件名 而函数名又分: 1:无参函数 ?PR?函数名?文件名 2:有参函数 ?PR?_函数名?文件名 3:再入函数 ?PR?_?函数名?文件名 又例如 你定义了全局变量 unsigned char data temp1,temp2; unsigned char xdata temp3; 在test.c 文件中,编译器会为每个文件分0 到多个全局数据段,相同类型的全局变量被存到 同一段中。所以上面会编译成如下: RSEG ? DT? TEST . temp1: DS 1 . temp2: DS 1 ; RSEG ?XD? TEST . temp3: DS 1 //下面是各个类型的数据全局段的表示 ?CO? 文件名 //常数段 ?XD? FILE_NAME //XDATA 数据段 ?DT? FILE_NAME //DATA 数据段 ?ID? FILE_NAME //IDATA….. ?BI? FILE_NAME // BIT ….. ?BA? FILE_NAME //BDATA…. ?PD? FILE_NAME //PDATA….. 看到这里大家应该明白段的意思了吧。也许你会问,这有什么作用哪?它就是用在当你需要 用汇编语言写一部份程序的时候,把汇编写的函数放在这个问件中,改名xxx.a51,按上面的 规则写。 编译就好。 既然知道了段的意思,现在我们回到SEG 的用法上来。 A51 中有两种段选择指令 : 再定位段选择指令 和 绝对段选择指令. 它们用来选择当前段 是再定位段还是绝对段。使用不同的段选择指令,将使程序定位在不同的地址空间之内。 1: 再定位段的选择指令是: RSEG 段名 它用来选择一个在前面已经定义过的再定位段作为当前段。 用法就像我们上面的例子,先申明了一个函数段,后面写这个函数段。 2: 绝对段选择指令 CSEG [AT 绝对地址表达式] //绝对代码段 DSEG [AT 绝对地址表达式] // 内部绝对数据段 XSEG [AT 绝对地址表达式] //外部绝对数据段 ISEG [AT 绝对地址表达式] // 内部间接寻址绝对数据段 BSEG [AT 绝对地址表达式] //绝对位寻址段 它们的用法我举一个例子: 例如我们写串口中断程序,起始地址是0x23.就这样写 CSEG AT 0X23 LJMP serialISR RSEG ?PR?serialISR?TEST . serialISR:

文档评论(0)

1亿VIP精品文档

相关文档