汇编语言——将DX,AX组成的32位数逻辑左移3位

文章讲述了在执行CPU指令时,对DX进行带进位循环左移(RCL)操作的过程,探讨了不同移位顺序对结果的影响,最终确定RCL是先移进CF,再用移出的最高位覆盖CF。
摘要由CSDN通过智能技术生成

在这里插入图片描述
写到这里,有点疑惑五角星的四个步骤的先后顺序,因为先后顺序会改变移位结果

去翻了课本,但是课本啥都没说:

在这里插入图片描述
于是 我修改了数据:

mov dx,458			;0000 0001 1100 1010  /  01CAH
mov ax,-7649		;1110 0010 0001 1111(补码)  /   0E21FH

如果dx是先左移1位,用高位覆盖原来的CF,再把CF移进最低位的话,
则最后dx的结果为0 0001 1100 1010000 / 0E50H

如果dx是先左移1位,用原来的CF移进最低位,再用移出去的最高位覆盖CF的话,
则最后dx的结果为0 0001 1100 1010111 / 0E57H

通过调试可以知道结果:

在这里插入图片描述
接下来AX逻辑左移一位,观察AX和CF的变化:

由 1110 0010 0001 1111(补码) / 0E21FH
变成 110 0010 0001 11110(补码) / 0C43EH
并且CY,表示CF=1(即AX左移出去的最高位)

在这里插入图片描述
接下来DX带进位循环左移一位,观察DX和CF的变化:

由 0000 0001 1100 1010 / 01CAH
变成 000 0001 1100 10101 / 0395H
并且NY,表示CF=0(即DX左移出去的最高位)

说明RCL是将原先的CF移进最低位,再用移出去的最高位修改CF

在这里插入图片描述
直接跳过循环,看最终结果:

在这里插入图片描述
最后得出结论:

rcl dx,1是先左移1位,用原先的CF移进最低位,再用移出去的最高位覆盖CF

(有不对的地方请指正)

原先的循环体可以修改为:

在这里插入图片描述

data segment
data ends
stack segment stack
	top label word
	dw 100 dup (?)
stack ends
code segment
	assume cs:code,ds:data,ss:stack
main proc far
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	lea sp,top
	
	;0000 0001 1100 1010 | 1110 0010 0001 1111
	;dx=01CA ax=E21F(补码)
	;逻辑左移三位后:0 0001 1100 1010  111  |  0 0010 0001 1111000
	;dx=0E57 ax=10F8
	mov dx,458			;0000 0001 1100 1010
	mov ax,-7649		;1110 0010 0001 1111(补码)
	
	mov cx,3
L1:
	shl ax,1		;ax逻辑左移
	rcl dx,1		;dx带进位循环左移
	loop L1
	
	mov ah,4ch
	int 21h
main endp
code ends
	end main
  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值