`
decentway
  • 浏览: 157879 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

lab2000p程序s2.asm

 
阅读更多

 

;二进制到BCD码转换

;将A拆分为三个BCD码,并存入Result开始的三个单元

 

Result equ 20h

       org 0

       ljmp start

BinToBCD:

       mov b,#100

       div ab

       mov Result,a     ;除以100,得百位数字

 

       mov a,b

       mov b,#10

       div ab

       mov Result+1,a   ;余数除以10,得十位数

 

       mov Result+2,b   ;余数为个位数

       ret

 

Start:

      mov sp,#40h

      mov a,#123

      call BinToBCD

      ljmp $

 

      end

1,org 0

    告诉编译器,ORG 000Bh这句话后面的所有语句(直到出现下一个ORG标识语句前的程序),是从程序存储器的000BH这个地址开始的。

也就是说,它指定了后面的程序放在内存的哪个地方。

下面知识点有详解。

2,ljmp start

跳转到start处,

3,start:

mov sp,#40h

把40h压入堆栈sp

4,mov a,#123

对a赋值123

5,call BinToBCD

调用回调函数

6,div ab

 

除法指令DIV AB AB寄存器中的28位无符号整数相除,被除数在A中,除数在B运算结束后,

商存于A中,佘数存于B中。

    若除数为0,溢出标志OV1,否则置0

    除法指令执行后,进位标志CY同样被清零,奇偶标志P仍按一般规则处理 。

    假定指令运前A中为63H,B中为3H,则指令执行后A中为21HB中为0,OV中为0,CY0,P0

    若指令运前A中为79H,B中为12H,则指令运行后A中为6,B中为7,OV0,CY0,P0

7,余下的指令都比较简单,就是把结果存于Result ,Result+1,Resutl+2处。

 

<!--EndFragment-->

 

知识点:

1.伪指令:

    用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。 将相对于程序或相对于寄存器的地址载入寄存器中。 与 ADR 指令相似。ADRL 所加载的地址比 ADR 所加载的地址更宽,因为它可生成两个数据处理指令。

2,org

 

 

org指定绝对地址的好处是,维护代码的时候不必再行计算相应代码被安排的地址。换句话说,如果你接手一份代码的时候,尚未完全了解硬件平台,未必清楚它的中断向量表大小,如果没有org指定主程序入口地址,你又如何能快速的判断呢 

 

举例说,你的“一般的  org 2000H;ajmp main;org 2013H;ajmp Int_ADC......”

实际上是指 ajmp main这条指令被放在rom的0x2000,ajmp Int_ADC这条指令被放在0x2013,而并不是说“main函数从0x2000开始、Int_ADC函数从0x2013开始”,所以你不必担心。只需要确保一条ajmp指令的长度不要大于0x13就没有问题(当然不会大于,64位系统的jmp也只有5字节) 

如果程序强行指定那两个函数的入口地址,是这样写的:

org 2000H

main:

  xxx

  xxx

  ...

 

org 2013H

Int_ADC:

  xxx

  xxx

如果是这样写的,那么就表示main被强制指定到0x2000,Int_ADC被强制指定到0x2013,那么如果main后面的代码多于0x13字节,就会出问题了。

 

3,

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics