|
发表于 2013-7-10 21:57:44
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-7-11 11:10 编辑
抱歉看错了编辑下
把mov ax,[2000h]
看成mov ax,2000h了。。
MOV CL,4
MOV AX,〔2000H〕
SHL AL,CL
SHR AX,CL
MOV 〔2000H〕,AX
试问若程序执行前,数据段内(2000H)=09H,(2001H)=03H,则执行后有(2000H)=(?),(2001)=(?)该程序实现什么功能?
程序实现的功能没有实际意义(这里的实际意义的意思就是比如播放MP3之类的有意义的事情)
就是将AL左移4位,然后将AX右移4位,最后把AX的值放给内存2000h-2001h位置(因为2000h不够放AX所以会拖2001h这个基友一起放AX)
那么开始将下该程序的功能
首先在执行shl al,cl之前,AX=【2000H】=0309h,shl al,cl这语句的意思就是把cl中存储的数作为左移的位数,然后将al左移
CL这里等于4
也就是将al左移四位(这里的位指的是二进制的位)
AX=0309h
那么AL就等于AX的低八位也就是09h
那么将al左移4位就等于将09h左移4位
看下09h的二进制1001b
左移4位也就是把1001一起往前移动4位,然后在后面添4个0
也就是10010000b
也就是90H
这时候ax =0390h
然后shr ax,cl
将0390h右移4位
首先看看2000h的二进制
1110010000b
右移四位也就是把最右边的四位舍去,然后最前面添加4个0、
也就是变成0000111001b
也就是39h啦
那么这时候AX=0039H
然后mov [2000h],ax
但是2000h这个地方只能放一个字节(最大FFh),不够放200h,所以只好拖它的好基友2001h(往高地址拖人)来存放高8位
自己存放低八位
总结就是:
执行后有(2000H)=(AX中的低8位也就是AL的值39h),(2001)=(AX中的高8位也就是ah的值00h)
至于左右关于左移右移的常见功能,比如就如楼上版主所说的
每左移一位相当于乘以2,左移4位相当于乘以16
每右移一位相当于除以2、
当然还有其他的功能比如说,那个,给你讲个32位的故事吧,32位寄存器EAX是AX的爸爸,
当时他并不像ax一样可以分成AH AL这样,只有EAX和AX,所以有时候我们
EAX=20000000h,中的高16位2000h我们想把它移到低16位,这时候右移指令就出场了
shr eax,16就可以实现我们要的东西了
当然还有其他运用,比如加密解密之类的
|
评分
-
查看全部评分
|