一个很菜的问题:一个字的位反向排序的好方法

gauss 2000-04-21 11:25:00
要求只用8086的指令

所谓反向排序就是将字的高位和低位互换

31 30 29 。。。。。16 15。。。。。。5 4 3 2 1 0

变成

0 1 2 3 4。。。。。。15 16。。。。。。29 30 31

用循环等笨办法肯定可以做到,但是有没有比较简单漂亮的方法呢?
我还没有想出来,所以求教于各位高手。
...全文
199 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gauss 2000-05-07
  • 打赏
  • 举报
回复
感谢Arsoka提供的简洁的代码,
但我想我的代码执行起来会快一点。
Do you agree?
Arsoka 2000-05-01
  • 打赏
  • 举报
回复
xor ax,ax
mov cl,010h
loopn; ror dx,1
rcl ax,1
loop loopn
mov dx,ax
我调试过,可行!8-)
Arsoka 2000-04-30
  • 打赏
  • 举报
回复
数在dx中,结果在dx中, ax 辅助用,
xor ax,ax
loop1: mov cl,010h
ror dx,1
rcl ax,1 ;将CF送入ax
loop loop1
mov dx,ax
写的仓促,大概是这样吧.:)

茂奇软件 2000-04-25
  • 打赏
  • 举报
回复
到SIMD中找找。
说不上会有几个机器指令符合
你的需要。有空我也会帮你找找。
(我知道有。)

Jansen Zhu.
gauss 2000-04-25
  • 打赏
  • 举报
回复
感谢GreenStuff和jansenzhu。
但我要求只用8086的指令实现。

我想了一个算法:
现在贴出来,大家帮忙看看。有好意见的分照给。

为简单起见,只讨论8位。
将一个8位的寄存器反向排序。假设要排序的数在DX,输出结果也放在DX.

AX是临时的变量,BX的作用是MASK,CL是移位位数。

假设DX为 1101 1001。

MOV AX,DX
MOV BX,0F0H ;(1111 0000)
MOV CL,4
AND AX,BX
SHR AX,CL
NOT BX
AND DX,BX
SHL DX,CL
OR DX,AX

;现在DX变成 1001 1101 (前后4位互换)

MOV AX,DX
MOV BX,0CCH ;(1100 1100)
MOV CL,2
AND AX,BX
SHR AX,CL
NOT BX
AND DX,BX
SHL DX,CL
OR DX,AX

;现在DX变成 01 10 01 11 (高低4位各自进行高低2位互换)

MOV AX,DX
MOV BX, 0AAH;(1010 1010)
MOV CL,1
AND AX,BX
SHR AX,CL
NOT BX
AND DX,BX
SHL DX,CL
OR DX,AX

;现在DX变成 10 01 10 11 (相邻互换)

反向排序完成。

算法的思路跟二路归并排序差不多,
不同的是从大到小来排。

理论上,一个2^N位的寄存器可以用N步排完,而不是2^N次。
8位3次,16位4次,32位5次。
GreenStuff 2000-04-21
  • 打赏
  • 举报
回复
看看!

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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