VC内联汇编ADD、ADC指令疑惑

zphmy 2009-04-10 09:11:14
最近我在编写一个大数加运算的时候发现了以下问题:

augend48是一个6Byte大端格式存储的被加数首地址
addend32是一个4Byte小端格式存储的long型数据首地址
rslt48是一个6Byte大端格式存储的结果首地址
void add_6byte(
void *augend48,
void *addend32,
void *rslt48)
{
__asm{
////////////////////////
// Protect registers' data
PUSH EAX
PUSH EBX
PUSH EDX
PUSH ESI
PUSH EDI
PUSH ECX
////////////////////////
// Start big int add
XOR EBX,EBX

MOV EAX,addend32
MOV EDX,[EAX] // EDX stores Int32 addend data
MOV EDI,rslt48 // EDI stores Int48 result data's address
MOV ESI,augend48 // ESI stores Int48 augend data's address
ADD EDI,5
ADD ESI,5
CLC
CLD
MOV ECX,6
NEXT_BYTE:
MOV AL,[ESI]
ADC AL,DL
MOV [EDI],AL
DEC ESI
DEC EDI
SAR EDX,8
LOOP NEXT_BYTE
////////////////////////
// Restore registers' data
POP ECX
POP EDI
POP ESI
POP EDX
POP EBX
POP EAX
}
}

以上代码当我输入以下数据时出现了意想不到的结果:

augend48: {0x00,0x53,0xF5,0x85,0x90,0xF3}
addend32: {0x17,0xAC,0xFF,0xFF}
期望结果: {0x00,0x53,0xF5,0x85,0x3D,0x0A}
VC运行后结果: {0x00,0x53,0xF5,0x85,0x3C,0x0A}(很令人无语)

augend48: {0x00,0x53,0xF5,0x85,0x3D,0x0A}
addend32: {0xA9,0xBB,0xFF,0xFF}
期望结果: {0x00,0x53,0xF5,0x84,0xF8,0xB3}
VC运行后结果: {0x00,0x53,0xF5,0x85,0xF9,0xB3}

期望各位大能能够帮我指出问题,谢谢!







...全文
497 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wp999876 2021-07-23
  • 打赏
  • 举报
回复

BYTE 与 cha 的 区别

Clerk_9919 2009-04-10
  • 打赏
  • 举报
回复
很明显是进位错误嘛
zphmy 2009-04-10
  • 打赏
  • 举报
回复
谢谢 Clerk_9919 的热心帮助!

唉,自大学毕业后没有用汇编,把他都还给老师了.简直是醍醐灌顶啊.
Clerk_9919 2009-04-10
  • 打赏
  • 举报
回复
你用的ADC指令没起到进位的作用,因为你两次相加中间执行了其它指令,标志寄存器的值早就不正确了,你可以用PUSHF和POPF对标志寄存器的值进行保存和提取。

		////////////////////////
// Protect registers' data
PUSH EAX
PUSH EBX
PUSH EDX
PUSH ESI
PUSH EDI
PUSH ECX
////////////////////////
// Start big int add
XOR EBX,EBX

MOV EAX,addend32
MOV EDX,[EAX] // EDX stores Int32 addend data
MOV EDI,rslt48 // EDI stores Int48 result data's address
MOV ESI,augend48 // ESI stores Int48 augend data's address
ADD EDI,5
ADD ESI,5
CLC
CLD
MOV ECX,6
PUSHF
NEXT_BYTE:
MOV AL,[ESI]
POPF
ADC AL,DL
PUSHF
MOV [EDI],AL
DEC ESI
DEC EDI
SAR EDX,8
LOOP NEXT_BYTE
POPF
////////////////////////
// Restore registers' data
POP ECX
POP EDI
POP ESI
POP EDX
POP EBX
POP EAX
内容概要:本文针对光储充一体化社区中电动汽车的有序充电问题,提出并实现了一种双层优化策略,旨在协调系统经济性与用户充电体验。该策略构建主从博弈模型,上层以电网侧经济运行目标优化动态充电定价,下层以用户侧满意度最大化为目标优化个体充电行为,通过Matlab代码进行建模与仿真验证。研究综合考虑光伏发电的不确定性、储能系统的充放电特性以及电动汽车充电需求的时空分布特征,建立了完整的数学优化模型,并设计相应的求解算法,有效实现了削峰填谷、降低用户成本、提高可再生能源就地消纳率等多重目标,为新型配电系统的协同优化提供了可行方案。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员,以及从事新能源接入、智能电网、电动汽车调度等相关领域的工程技术人员。; 使用场景及目标:①深入理解光储充一体化系统中多主体互动机制与有序充电调度原理;②掌握双层优化模型(特别是主从博弈)的构建思路与求解方法;③学习如何利用Matlab实现复杂能源系统的仿真建模与数据分析,服务于科研论文撰写、课题研究或实际工程项目开发。; 阅读建议:此资源强调理论建模与代码实践的紧密结合,建议读者在阅读过程中对照文档中的模型推导步骤,逐行分析Matlab代码实现逻辑,动手复现仿真结果,深入理解变量设置、约束条件处理及算法迭代过程,从而提升独立解决综合能源系统优化问题的能力。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧