写到这里,有点疑惑五角星的四个步骤的先后顺序,因为先后顺序会改变移位结果
去翻了课本,但是课本啥都没说:
于是 我修改了数据:
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