打印

2407高手帮我纠正一下汇编程序错误

[复制链接]
2055|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qzx0580|  楼主 | 2007-9-17 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//实现32位数除以16位数功能
//x   --------------  被除数
//y  --------------      除数
//z ---------------   返回值

//   ---------------   c 调汇编 ----------------
//  ----因为不会在汇编中定义局部变量,所有参数均用AR寄存器存储-----

   .bss H_div,1
        .def        _DivideQ14  
    .global _z        
        .globl  _y       
        .globl  _x    
    
        .text
  
******************************************************
* FUNCTION DEF : _DivideQ14
******************************************************
_DivideQ14:

     POPD        *+                ;Move return address to C stack
         SAR        AR0,*+            ;Save Frame Pointer
         SAR        AR1,*             ;Save Stack Pointer
         LARK        AR0,#3             ;Size of Frame 
     LAR        AR0,*0+,AR0       ;ARP = AR0,AR0 = New Frame 
     
     SBRK   #3                
     LAR   AR1,*              ;x ------------------------->AR1
     SBRK   #1
     LAR   AR2,*              ;y  ------------------------>AR2
     SBRK   #1
     LAR   AR3,*              ;z ------------------------->AR3
     LARK  AR4,#3FFFH 
     MAR   *,AR4 
     LT    *,AR1              ;T = 0x3FFF  
     MPY   * ,AR5           ; PREG <---------------x * 0x3FFF 
     PAC   
     SACH         *,AR6          ; 执行这条语句时,AR6中内容与复位后无异,即这条语句执行失败.
     SACL         *,AR4          ; 以下语句都失败,单步执行的时候AR的值无任何变化
     
     LACC        *,16,AR5 
         ADDS        *,AR4  
         SACH        *,AR5  
         SACL        *,AR2  
         
         LACC        *,16,AR6   
         SACH        *,AR4  
         LACL        *,AR6
         RPT        #15
         SUBC        *,AR4
         SACL        * 
         
         XOR        *,AR5
         OR                *,AR6 
         RPT        #15
         SUBC        *,AR6
         SACH        *,AR3
         SACL        *
           
  
     MAR *-  
     SBRK        4
         LAR        AR0,*-
         PSHD        *
         RET 

相关帖子

沙发
qzx0580|  楼主 | 2007-9-18 07:46 | 只看该作者

不明白

SACH         *,AR6          ; 执行这条语句时,AR6中内容与复位后无异,即这条语句执行失败.
     SACL         *,AR4          ; 以下语句都失败,单步执行的时候AR的值无任何变

---------------------------------------------------------------------
以上这两句执行后AR无变化是我想不明白的.后面的语句暂且不提了.

使用特权

评论回复
板凳
qzx0580|  楼主 | 2007-9-19 07:31 | 只看该作者

据说这两句不对

SACH         *,AR6          ; 执行这条语句时,AR6中内容与复位后无异,即这条语句执行失败.
     SACL         *,AR4          ; 以下语句都失败,单步执行的时候AR的值无任何变化

这样执行的操作是将ACC中的高十六位赋给了AR6所指向的单元.

在汇编中怎样定义局部变量,将ACC中的高十六位赋给它呢?

请指教!

使用特权

评论回复
地板
qzx0580|  楼主 | 2007-9-26 08:16 | 只看该作者

没人帮忙.

敬请指点!

使用特权

评论回复
5
yexianchun| | 2007-10-3 11:24 | 只看该作者

RE

SACH         *,AR6          ; 执行这条语句时,AR6中内容与复位后无异,即这条语句执行失败.
     SACL         *,AR4          ; 以下语句都失败,单步执行的时候AR的值无任何变化

这样执行的操作是将ACC中的高十六位赋给了AR6所指向的单元.

在汇编中怎样定义局部变量,将ACC中的高十六位赋给它呢?

请指教!


SACH *,AR6   ;是把ACCH 放到当前辅助寄存器指针*(AR5)的位置,然后当前积存器*设为AR6 是你对汇编的理解有误

使用特权

评论回复
6
tjsheep| | 2007-10-3 18:48 | 只看该作者

汇编中没有局部变量的概念……

最多就是模仿c,然后手动维护一个堆栈

使用特权

评论回复
7
cn_luo| | 2007-10-18 22:55 | 只看该作者

AR是辅助寄存器

AR是辅助寄存器,类似于C中的指针的概念,没有实际的物理地址。一般来说,不能直接参与运算。对AR的存取实际是对以AR内容为地址的单元进行操作。
你的程序基本上都不能执行你的想法。
我用汇编,没用过C。不知道你的问题怎么解决

使用特权

评论回复
8
qzx0580|  楼主 | 2007-10-19 15:36 | 只看该作者

问题已解决

遇上一位高人,问题就解决了.

使用特权

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

本版积分规则

28

主题

172

帖子

0

粉丝