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}

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







...全文
493 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
内容概要:本文研究了基于空调与电动汽车联合虚拟储能的海岛微电网协同优化调度问题,提出了一种融合虚拟储能技术与混合整数线性规划(MILP)的多目标优化模型。通过将温控负荷(如空调)和电动汽车的充放电行为建模为可调度的虚拟储能资源,充分挖掘其在时间维度上的灵活调节潜力,实现对微电网中可再生能源波动的有效平抑。研究构建了一个涵盖经济性、可再生能源消纳率和系统运行稳定性的综合优化目标函数,并采用MILP方法进行高效求解,实现了源-荷两侧的协同优化调度。仿真结果表明,该策略不仅能显著降低系统综合运行成本,还能提升清洁能源的就地消纳水平,增强海岛微电网在孤立运行条件下的灵活性与韧性。; 适合人群:具备电力系统、能源优化或自动化相关背景,从事微电网、可再生能源集成、需求响应或智能调度研究的研发人员和研究生。; 使用场景及目标:①应用于海岛等远离主网的孤立微电网能量管理系统;②挖掘温控负荷与电动汽车的隐性储能价值,提升电网对高比例可再生能源的接纳能力;③为源荷互动、需求侧资源聚合参与优化调度的研究与实践提供可复现的模型框架与Matlab代码实现方案。; 阅读建议:此资源包含完整的Matlab代码实现,建议读者结合文档中的模型构建思路与仿真结果进行学习,重点关注虚拟储能的数学建模方法、多目标优化的线性化处理技巧以及MILP求解器的应用,可通过调整负荷参数、新能源出力场景等方式进行复现与拓展性实验。

3,881

社区成员

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

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