• RSEG用法和汇编问号的涵义


    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:

  • 相关阅读:
    i春秋CTF-web-upload
    [转]SEP 11.x 迁移
    通过SEP禁用USB
    通过SEP屏蔽共享文件夹
    SEP图示
    离线更新SEPM服务器的病毒定义库
    SEPM安装完之后的一些细节之处
    Bloomberg SEP 12.x 迁移小记
    LiveUpdate Adminstrator配置手册
    Symantec更新服务器
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/10325492.html
Copyright © 2020-2023  润新知