32位循环左移一位(汇编)
移位操作为 二进制的移位!!!
首先需要转换为 二进制,再进行移位
大致思路
- 先将三十二位分解位低16位 和 高16位,分别放入AX和BX中
- 再将 低16位 逻辑左移 , 高位循环左移
- 再通过
ADC
加法进位
实现代码
DATA SEGMENT
X DD 6A6A6A6AH
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODE , DS:DATA
START:
MOV AX , DATA
MOV DS , AX
;----
MOV AX , WORD PTR X
MOV BX , WORD PTR X + 2
SHL AX , 1
RCL BX , 1
ADC AX , 0
MOV WORD PTR X , AX
MOV WORD PTR X + 2 , BX
MOV AX , WORD PTR X
MOV BX , WORD PTR X + 2
;---
MOV AH , 4CH
INT 21H
CODE ENDS
END START
代码解释
数据段代码
DATA SEGMENT
X DD 6A6A6A6AH
DATA ENDS
将32位数拆解为 低位
和 高位
MOV AX , WORD PTR X
MOV BX , WORD PTR X + 2
- AX只能放下 16位数即 2个字
字节(Byte) 有8位
字(Word) 由 两个字节(byte)组成(16位)
双字(DoubleWord) 由 两个字(word) 组成
(32位)
- word为字,可以放下16位的数
- 偏移 两位之后,相当于 偏移了 16位(AX的大小)
逻辑左移低位
SHL AX , 1
- X是从存放的是 低地址 , 所以在前面mov的时候就会将低位赋值给X
- 并且 将 最高位的值送给CF标志位
循环左移高位
RCL BX , 1
在上一步,我已经完成了低位的左移,CF中已经有 低位的最高位的值了
此时我进行循环左移
- 将之前的CF的值放入 BX的低位
- 再将 BX的最高位 放入 CF中
最高位加到最低位
ADC AX , 0
- ADC是将 源操作数(0)+ CF(最高位) 的值加到 目的操作数(AX)中
重新赋值
MOV WORD PTR X , AX
MOV WORD PTR X + 2 , BX
查看结果
MOV AX , WORD PTR X
MOV BX , WORD PTR X + 2
6A6A6A6A
对应二进制左移
一位后,结果就是D4D4D4D4