汇编语言如何在宏中实现-(2X+4Y)/X算术表达式的计算
原宏代码问题梳理
- 缺少4Y计算逻辑:代码仅完成2X加Y的操作,完全没有对第二个参数Y做乘4的处理,不符合2X+4Y的表达式要求
- 取反逻辑错误:
xor eax, ebx仅为按位异或操作,无法实现算术取反的效果,正确的32位整数取反应该使用neg指令 - 除法逻辑完全错误:表达式要求除以变量X,并非除以2,
shr eax,1仅能实现无符号数除以2的操作,完全不匹配当前除法需求,且x86除法指令要求被除数存放在edx:eax寄存器对中,原代码未做任何除法前置准备 - 存在寄存器污染:未保存直接修改的
ebx寄存器,会破坏调用方的寄存器上下文
修正后可正常运行的宏实现
以下实现针对x86 32位有符号整数场景,输入参数num1为表达式中的X,num2为Y,计算结果保存在eax寄存器中:
addMultiply MACRO num1, num2 push ebx ; 保存调用方寄存器,避免上下文污染 push edx ; 计算2X mov eax, num1 add eax, eax ; 等价于shl eax,1,完成乘2操作 ; 计算2X + 4Y mov ebx, num2 shl ebx, 2 ; Y左移2位完成乘4操作 add eax, ebx ; 取反得到 -(2X+4Y) neg eax ; 有符号除法除以X cdq ; 将eax的符号位扩展到edx,构成64位被除数edx:eax idiv num1 ; 有符号除法,商默认存入eax,余数存入edx pop edx ; 恢复调用方寄存器 pop ebx ENDM
使用注意事项
- 如果是无符号数计算场景,将
neg替换为按位取反加1的逻辑、cdq替换为xor edx, edx、idiv替换为div即可 - 代码默认输入的X不为0,实际使用时需要额外增加除零异常的判断处理
内容的提问来源于stack exchange,提问作者SaltandSorrow
相关产品推荐
相关产品推荐

