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

将C语言矩形判断函数转为emu8086汇编后存在Bug求助

排查emu8086汇编矩形判断函数的Bug

原C语言矩形判断函数

该函数通过判断四个点到中心的距离平方是否相等,来确定是否构成矩形:

bool isRectangle(unsigned int x1, unsigned int y1, unsigned int x2,
 unsigned int y2, unsigned int x3, unsigned int y3, unsigned int x4, 
unsigned int y4)
{
   double cx,cy;
   double dd1,dd2,dd3,dd4;
   cx=(x1+x2+x3+x4)/4;
   cy=(y1+y2+y3+y4)/4;
   dd1=(cx-x1) * (cx-x1) + (cy-y1) * (cy-y1);
   dd2=(cx-x2) * (cx-x2) + (cy-y2) * (cy-y2);
   dd3=(cx-x3) * (cx-x3) + (cy-y3) * (cy-y3);
   dd4=(cx-x4) * (cx-x4) + (cy-y4) * (cy-y4);
   return dd1==dd2 && dd1==dd3 && dd1==dd4;
}

转换后的emu8086汇编函数

isRectangle PROC 
    
          xor ax,ax
          mov al, matrix[0]
          
          xor dx,dx
          mov dl,matrix[2]
          add ax,dx 
          
          xor dx,dx
          mov dl,matrix[4]
          add ax,dx
                    
          xor dx,dx
          mov dl,matrix[6]
          add ax,dx
          
          xor dx,dx
          mov dl,4 
          div dl
          xor ah,ah  
          mov centerX,ax
              
              
              
          xor ax,ax
          mov al, matrix[1]
          
          xor dx,dx
          mov dl,matrix[3]
          add ax,dx 
          
          xor dx,dx
          mov dl,matrix[5]
          add ax,dx 
          
          xor dx,dx
          mov dl,matrix[7]
          add ax,dx 
          
          xor dx,dx
          mov dl,4 
          div dl
          xor ah,ah 
          mov centerY,ax    
          
          
        
          mov ax,centerX
          xor cx,cx
          mov cl,matrix[0]
          sub ax,cx
          mul ax
          mov dx,ax 
          mov bx,centerY
          xor cx,cx
          mov cl,matrix[1]
          sub bx,cx
          mov ax,bx
          mul ax 
          add dx,ax 
          mov dd1,dx      
                            
          mov ax,centerX 
          xor cx,cx
          mov cl,matrix[2]
          sub ax,cx
          mul ax
          mov dx,ax 
          mov bx,centerY
          xor cx,cx
          mov cl,matrix[3]
          sub bx,cx
          mov ax,bx
          mul ax 
          add dx,ax 
          mov dd2,dx 
                 
          mov ax,centerX 
          xor cx,cx
          mov cl,matrix[4]
          sub ax,cx
          mul ax
          mov dx,ax 
          mov bx,centerY
          xor cx,cx
          mov cl,matrix[5]
          sub bx,cx
          mov ax,bx
          mul ax 
          mov bx,ax 
          add dx,bx 
          mov dd3,dx           
          
          mov ax,centerX 
          xor cx,cx
          mov cl,matrix[6]
          sub ax,cx
          mul ax
          mov dx,ax 
          mov bx,centerY
          xor cx,cx
          mov cl,matrix[7]
          sub bx,cx
          mov ax,bx
          mul ax 
          mov bx,ax 
          add dx,bx 
          mov dd4,dx    
                    
          xor ax,ax
          mov ax,dd1    
                
          cmp ax,dd2  
          jne return                    
         
          cmp ax,dd3   
          jne return    
          
          cmp ax,dd4 
          jne return        
          
          PRINT "The shape is rectangle"  
          int 21h                         
          ; draw the rectangle  
          
          ret  
          return:ret
          centerX dw 0 
          centerY dw 0  
          dd1 dw 0      
          dd2 dw 0   
          dd3 dw 0 
          dd4 dw 0    
isRectangle  ENDP  

数据段定义

matrix db 2 dup(?)         
       db 2 dup(?) 
       db 2 dup(?) 
       db 2 dup(?)  

Bug排查分析

1. 中心坐标计算丢失小数部分

C语言用double类型计算中心坐标,会保留除法后的小数(比如四个x坐标和为奇数时,cx会是x.5的形式),但汇编代码中:

div dl
xor ah,ah  
mov centerX,ax

div dl执行后ah存储余数、al存储商,这里直接丢弃余数,只取整数部分存入centerX,导致中心坐标偏差,后续距离平方计算必然错误。

2. 乘法运算丢失高位数据

16位乘法指令mul ax的结果存在dx:ax(高位在dx,低位在ax),但代码仅保留了ax的值:

mul ax
mov dx,ax 

当(centerX - xn)值较大时,平方结果会超出16位范围,此时dx中的高位数据被完全丢弃,导致距离平方值计算错误。

3. 输出指令重复调用

PRINT是emu8086自带宏,内部已包含int 21h调用,额外执行int 21h会触发未定义的DOS功能调用,可能导致程序崩溃或异常。

4. 数据存储宽度不匹配(潜在问题)

C语言参数是unsigned int(通常16位或32位),但汇编中matrix定义为db(8位字节),若坐标值超过255会直接溢出,建议改为dw(16位字)匹配C的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:05:26