m0_74054968 2024-04-17 21:22 采纳率: 100%
浏览 1
已结题

有关32位汇编的排序问题,切换数据类型导致结果无法实现

32位汇编的问题,目的是实现冒泡排序,为什么同样的代码,把数组的类型从dword换成byte就不行了
放代码
先放原始代码
INCLUDE irvine32.inc
.data
array dword 587,-632,777,234, -34
count = lengthof array
.code
main PROC
mov ecx,count
dec ecx
outlp:
mov edx,ecx
mov ebx,offset array
inlp:
mov eax,[ebx]
cmp eax,[ebx+4];如果小于就交换
jng next
xchg eax,[ebx+4]
mov [ebx],eax
next:
add ebx,4
dec edx
jnz inlp
loop outlp

main endp
end main
这个可以实现排序
再把array数组的数据类型从双字换成byte
如下:
INCLUDE irvine32.inc
.data
array byte 7,32,17,23,3
count = lengthof array
.code
main PROC
mov ecx,count
dec ecx
outlp:
mov edx,ecx
mov ebx,offset array
inlp:
mov eax,[ebx]
cmp eax,[ebx+1];如果小于就交换
jng next
xchg eax,[ebx+1]
mov [ebx],eax
next:
add ebx,1
dec edx
jnz inlp
loop outlp
main endp
end main
就无法实现排序了。
为什么呢?
请各位朋友指教

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-17 21:22
    关注

    引自免费微信小程序:皆我百晓生

    在您的例子中,问题在于当您将数组从dword类型更改为byte类型后,内存中的元素大小发生了变化。原本每个元素占用4个字节,而在byte模式下,每个元素只占用了1个字节。因此,在比较和交换操作时,您需要相应地调整偏移量。

    在原始的dword版本中,每次比较和交换的操作是基于每个元素之间的4个字节的步进(因为一个dword是4字节)。但在byte版本中,您应该每次增加1个字节而不是4个字节。

    下面是修改后的代码,用于处理byte类型的数组进行冒泡排序:

    INCLUDE irvine32.inc
    
    .data
    array byte 7,32,17,23,3
    count = lengthof array
    
    .code
    main PROC
        mov ecx, count
        dec ecx
        
    outlp:
        mov edx, ecx
        
        mov ebx, offset array
        
    inlp:
        mov al, [ebx] ; 使用al寄存器读取byte类型
        cmp al, [ebx + 1]
        jng next
        
        xchg al, [ebx + 1] ; 使用al寄存器进行交换
        mov [ebx], al
        
    next:
        add ebx, 1 ; 每次增加1个字节的偏移
        dec edx
        jnz inlp
        
        loop outlp
    
    main ENDP
    END main
    

    在这个修复后的代码中,我们使用了al寄存器来存储和操作byte类型的数据,并且在inlp循环中增加了1,而不是原来的4。这样,程序就能正确地对byte类型的数组进行冒泡排序了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有
  • ¥15 怎么把60秒的视频时长改成显示0秒?且视频内容没有任何变化的正常播放?目的是为了解决一些平台对视频时长的要求,最好有自动处理的工具!