32位循环左移一位(汇编)

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标志位

32位循环左移一位(汇编)

循环左移高位

RCL BX , 1

在上一步,我已经完成了低位的左移,CF中已经有 低位的最高位的值了

此时我进行循环左移

  • 将之前的CF的值放入 BX的低位
  • 再将 BX的最高位 放入 CF中

32位循环左移一位(汇编)

最高位加到最低位

ADC AX , 0
  • ADC是将 源操作数(0)+ CF(最高位) 的值加到 目的操作数(AX)中

32位循环左移一位(汇编)

重新赋值

MOV WORD PTR X ,  AX
MOV WORD PTR X + 2 , BX

查看结果

MOV AX , WORD PTR X 
MOV BX , WORD PTR X + 2

32位循环左移一位(汇编)

6A6A6A6A对应二进制 左移一位后,结果就是D4D4D4D4

上一篇:python中的数字函数和随机数函数


下一篇:python(np.random.seed())