打印

请教:十六进制转换为ASCII的程序问题

[复制链接]
4839|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SkyfreeEI|  楼主 | 2007-5-31 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在内部RAM的Hex单元中存有2位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两个单元中

主程序(MAIN):
                  mov  sp,#3FH
main:             push  hex
                  acall  HASC
                  pop  asc
                  mov   a,hex
                  swap     a
                  push     acc
                  acall   HASC
                  pop      asc+1



子程序(HASC) :
HASC:              DEC    SP
                   DEC    SP
                   POP    ACC 
                   ANL    A,#0FH
                   ADD    A,#7
                   MOVC   A,@A+PC
                   PUSH   ACC
                   INC    SP
                   INC    SP
                   RET
ASCTAB:            DB      "0,1,2,3,4,5,6,7"
                   DB      "8,9,A,B,C,D,E,F"  



请教:为什么在子程序当中用到两条DEC  SP指令?什么意思呢?
请高手指点,谢谢!

相关帖子

来自 2楼
dengm| | 2007-5-31 16:29 | 只看该作者

re:

          MOV A, hex
          ANL A, #0FH             ;是不是屏蔽高4位呀  : A: YES

          ADD A, #(ASCTAB-$-3)    ;??什么意思呢 

A;
          ADD A, #(ASCTAB-$-3)   为 2 字节
          movc a, @a+pc          为 1 字节
                              共    3 字节
        所以 (ASCTAB-$) 要减 3。

使用特权

评论回复
板凳
conwh| | 2007-5-31 15:46 | 只看该作者

是不是将0-15(-255)的数,转换成16进制的字符型

使用特权

评论回复
地板
dengm| | 2007-5-31 16:15 | 只看该作者

没必要搞这么复杂

子程序(HASC) :
HASC:  
          MOV A, hex
          ANL A, #0FH
          ADD A, #(ASCTAB-$-3)
          MOVC A, @A+PC
          MOV ASC, A
          MOV A, hex
          SWAP A
          ANL A, #0FH
          ADD A, #(ASCTAB-$-3)
          MOVC A, @A+PC
          MOV (ASC+1), A
          RET
ASCTAB:            DB      "0,1,2,3,4,5,6,7"
                   DB      "8,9,A,B,C,D,E,F"  

使用特权

评论回复
5
SkyfreeEI|  楼主 | 2007-5-31 16:17 | 只看该作者

进制转换

回楼上,不是的这是单片机书上面的一个例子


我的理解如下:



主程序(MAIN):
                  mov  sp,#3FH        (SP)<--(3FH)
main:             push  hex            (hex)<--(40H)
                  acall  HASC          调用和转换程序
                  pop  asc
                  mov   a,hex
                  swap     a
                  push     acc
                  acall   HASC
                  pop      asc+1



子程序(HASC) :
HASC:              DEC    SP          (SP)=(03FH) ??   
                   DEC    SP          (SP)=(03EH)???
                   POP    ACC         (ACC)=(03EH)??
                   ANL    A,#0FH       ???
                   ADD    A,#7      
                   MOVC   A,@A+PC
                   PUSH   ACC
                   INC    SP
                   INC    SP
                   RET
ASCTAB:            DB      "0,1,2,3,4,5,6,7"
                   DB      "8,9,A,B,C,D,E,F"  



从题目看来hex仅仅代表一个十六进制的数而已,并非具体值.
我其它的地方看不懂,请指点,谢谢!

使用特权

评论回复
6
SkyfreeEI|  楼主 | 2007-5-31 16:23 | 只看该作者

回三楼

  回三楼,在你的程序当中

     
          MOV A, hex
          ANL A, #0FH             ;是不是屏蔽高4位呀
          ADD A, #(ASCTAB-$-3)    ;??什么意思呢?
我不懂,望指点

使用特权

评论回复
7
SkyfreeEI|  楼主 | 2007-5-31 16:48 | 只看该作者

re:

我还是不大明白 ADD A, #(ASCTAB-$-3)的具体含义: $代表当前值吗?
ASCTAB-$又是什么意思, ASCTAB-$-3呢?
我只能明白 #(ASCTAB-$-3)整体运算下来是一个立即数

使用特权

评论回复
8
dengm| | 2007-5-31 17:08 | 只看该作者

#(ASCTAB-$-3)为 movc a, @a+pc 的下一句

到标号 asctab 的字节数。看 MOVC A,@A+PC 指令的说明!!!

使用特权

评论回复
9
SkyfreeEI|  楼主 | 2007-5-31 17:18 | 只看该作者

谢谢指教了


谢谢指教了

使用特权

评论回复
10
zkybuaa| | 2013-8-22 10:01 | 只看该作者
这里我有一个困惑的问题是:INC SP 算是什么寻址方式的指令呢?
书上说,SP算是一个间接寻址方式,对SP操作,其实是对@SP操作。
而INC @R0 这种间接寻址方式,是个一字节指令。

而从程序上来看,INC SP是个两字节指令。
          ADD    A,#7                       ;变址寄存器加7
                   MOVC   A,@A+PC            ;变址方式查表
                   PUSH   ACC                     ;ACC入栈,2字节指令
                   INC    SP                           ;SP+1           2字节指令
                   INC    SP                           ;SP+1           2字节指令
                   RET                                   ;返回指令   1字节指令
ASCTAB:            DB      "0,1,2,3,4,5,6,7"      
  ;ASCTAB的首址距离查表指令有7个字节,所以前面有ADD  A,#7这条指令。  
                            DB      "8,9,A,B,C,D,E,F"  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝