书中这一部分给出的图是结果是有错误的,移位后,正确的结果是从 1001 1001 1001 1001 编程 0100 1100 1100 1100 1100,请注意这里使用的
移位结果产生的过程如下
1001 1001 1001 1001 1001 1001
0100 1100 1001 1001 1001 1001
0100 1100 0100 1100 1001 1001
0100 1100 0100 1100 0100 1100
;Multiple Doubleword Shift (MultiShf.asm)
;This program demonstrates a multibyte shift operation,
;using SHR and RCR instructions.
INCLUDE Irvine32.inc
.data
ArraySize = 3
array BYTE ArraySize DUP(99h) ; 1001 pattern in each nybble ;nybble n.半字节
; 十六进制下的99h就是模式为 1001 1001 的二进制数字
.code
main PROC
call DisplayArray ; display the array
mov esi,0 ; 循环移位的操作是从右向左进行的首先对最左边的一个字节进行携带符号位的移位,其次按顺序对左侧相邻的两个字节进行循环进位的移位操作。
;8086处理器是小端处理器,应该特别注意连续字节在内存中的分布
shr array[esi+2],1 ; high byte
rcr array[esi+1],1 ; middle byte, include Carry flag
rcr array[esi],1 ; low byte, include Carry flag
call DisplayArray ; display the array
call WaitMsg ;
exit
main ENDP
;----------------------------------------------------
DisplayArray PROC
; Display the bytes from highest to lowest
;----------------------------------------------------
pushad
mov ecx,ArraySize
mov esi,ArraySize-1
L1:
mov al,array[esi] ; AL存放需要显示的字符ASCII码
mov ebx,1 ; ebx表示字节为以单位显示的大小,这里是用了一个字节
call WriteBinB ; display binary bits 使用字节格式显示一个二进制整数,接收参数al,ebx,al表示二进制比特数值,ebx标志输出类型
mov al,' ' ;WriteChar使用AL寄存器来传递字符,用于显示在屏幕上
call WriteChar
sub esi,1 ;从后向前显示字符,偏移量减少
Loop L1
call Crlf
popad
ret
DisplayArray ENDP
END main
本文深入探讨了8086处理器上使用SHR和RCR指令进行多字节移位操作的过程,通过具体示例展示了如何在连续字节中实现循环移位,特别关注了小端处理器的字节分布特性。
4563

被折叠的 条评论
为什么被折叠?



