You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86-32 MASM环境下5字节有符号整数平方实现求助

实现x86-32 MASM下5字节有符号整数的平方运算

由于x86-32架构原生仅支持32位运算,我们可以通过拆分5字节数为高1字节+低4字节的方式,利用基本乘法和加法指令完成平方计算。核心思路是利用代数展开公式:对于5字节数 $N = A \times 2^{32} + B$($A$ 为最高1字节,$B$ 为低4字节),其平方为 $N^2 = A^2 \times 2^{64} + 2AB \times 2^{32} + B^2$,分步计算各部分后合并结果。

关键前提

有符号整数的平方结果一定是非负的,因此可以先将输入的5字节有符号数转换为绝对值,计算完成后无需恢复符号。

实现步骤(MASM + Irvine32)

1. 数据定义

.data
    fiveByteNum    BYTE 5 DUP(?)   ; 输入的5字节有符号整数(小端存储:最低字节在索引0,最高字节在索引4)
    squareResult   BYTE 10 DUP(0)  ; 存储10字节平方结果(小端存储)

2. 将5字节有符号数转换为绝对值

若最高字节的最高位为1(负数),对整个5字节数取补码(取反加1)得到绝对值:

.code
; 检查符号并取绝对值
CheckSign:
    mov al, fiveByteNum[4]
    test al, 80h          ; 检测最高位是否为1(负数)
    jz CalcSquare         ; 正数直接跳转到计算

    ; 对5字节数取反
    mov ecx, 5
    mov esi, OFFSET fiveByteNum
NegateLoop:
    mov al, [esi]
    not al
    mov [esi], al
    inc esi
    loop NegateLoop

    ; 加1处理进位
    mov esi, OFFSET fiveByteNum
    mov al, [esi]
    add al, 1
    mov [esi], al
    mov ecx, 4
CarryLoop:
    inc esi
    jnc CarryDone         ; 无进位则结束
    mov al, [esi]
    add al, 1
    mov [esi], al
    loop CarryLoop
CarryDone:

3. 拆分高1字节(A)和低4字节(B)

CalcSquare:
    ; 提取低4字节到EBX(无符号)
    mov ebx, DWORD PTR fiveByteNum
    ; 提取高1字节到AL(无符号)
    mov al, fiveByteNum[4]

4. 计算B²(64位结果),存入结果低8字节

; 计算B²,结果存于EDX:EAX
    mov eax, ebx
    mul eax
    ; 将结果写入squareResult的低8字节
    mov DWORD PTR squareResult[0], eax
    mov DWORD PTR squareResult[4], edx

5. 计算2×A×B,累加到结果中

; 计算A×B,结果存于EDX:EAX
    mov eax, ebx
    mul al                ; AL是A,EBX是B,mul ebx 也可以,这里用mul al更直接
    ; 64位左移1位实现×2
    shld edx, eax, 1
    shl eax, 1
    ; 累加到结果的对应位置,处理进位
    add DWORD PTR squareResult[0], eax
    adc DWORD PTR squareResult[4], edx
    mov ecx, 0
    adc ecx, 0            ; 保存高16位的进位

6. 计算A²,加上进位后存入结果高2字节

; 计算A²,结果存于AX
    mov al, fiveByteNum[4]
    mul al
    ; 加上之前的进位
    add ax, cx
    ; 写入结果的最高2字节
    mov WORD PTR squareResult[8], ax

7. (可选)用Irvine32库查看结果

; 显示10字节平方结果
    mov esi, OFFSET squareResult
    mov ecx, 10
    mov ebx, 1
    call DumpMem

注意事项

  • 所有运算均基于无符号数处理,因为已经将输入转换为绝对值,平方结果无需考虑符号。
  • 小端存储格式:x86架构下,多字节数据的最低字节存储在低地址,因此拆分和存储时需对应正确的索引。
  • 进位处理:64位加法可能产生进位到高16位,必须用adc指令传递进位,避免结果错误。

内容的提问来源于stack exchange,提问作者HJH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:17:12