TA的每日心情 | 开心 昨天 02:47 |
---|
签到天数: 158 天 [LV.7]常住居民III
荣誉版主
- 积分
- 4312
|
发表于 2024-3-24 14:37:22
|
显示全部楼层
回 神农鼎
以 32位乘除运算(MMD32_EABX)为例,
寄存器命名: EAX(DR4), EBX(DR0), ECX(08H), EDX(0AH),
执行 : {ECX,EAX} = EAX*/EBX/EDX;
extern long *mmd32(long EAX, long EBX, long EDX)
// 注: 返回结果存 指针指向 64位
汇编子程序:
mmd32?_ mov DR4, .. // 可重入函数, 传递参数
mov DR0, .. // 略(不会出错)
mov 0AH, ..
.... // 出错处
mov DMAIR,#MMD32_EABX // 执行32位乘除运算, CPU时钟停止.
.... // 出错处
mov xx,08H
mov xx,EAX
....
}
实例程序:
void int1(void) interrupt 1
{
long *mmd32(long EAX1, long EBX1, long EDX1);
}
void main(void)
{ do{
long *mmd32(long EAX0, long EBX0, long EDX0);
while(1);
出问题处如, 当 main 中 mmd32, 执行到 上述 mmd32?_ 汇编子程序中 红色或蓝色高亮显示处,
被中断打断, 中断执行新的 mmd32 后返回,
如是红色处被中断打断, 返回时 EDX(0AH) 被改变, 已不是 main 中 mmd32 的装载参数了, 而是中断中 EDX(0AH)的值. .
如是蓝色处被中断打断, 返回时 ECX(08H) 被改变, 已不是 main 中 mmd32 的装载参数了, 而是中断中 ECX(08H)的值. .
与执行32位乘除运算,暂时不给CPU时钟,CPU停止工作无关 !
|
|