鱼C论坛

 找回密码
 立即注册
查看: 4086|回复: 13

刚刚开始自学汇编,左移右移一般实现什么功能

[复制链接]
发表于 2013-7-10 14:20:35 | 显示全部楼层 |阅读模式
1鱼币
MOV CL,4
MOV AX,〔2000H〕
SHL AL,CL
SHR AX,CL
MOV 〔2000H〕,AX
试问若程序执行前,数据段内(2000H)=09H,(2001H)=03H,则执行后有(2000H)=(?),(2001)=(?)该程序实现什么功能?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-10 15:46:04 | 显示全部楼层
本帖最后由 Dardy 于 2013-7-10 15:47 编辑

执行后有[2000H]=39H,[2001H]=00H
不知道怎么概括这段代码的功能。

每左移一位相当于乘以2,左移4位相当于乘以16
每右移一位相当于除以2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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就可以实现我们要的东西了
当然还有其他运用,比如加密解密之类的

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
Dardy + 1 + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-10 22:07:46 | 显示全部楼层
比较啰嗦了点。希望你不要介意哈。这样讲应该比较好懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-10 22:58:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-10 22:59:12 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-7-10 21:57
MOV CL,4
MOV AX,〔2000H〕
SHL AL,CL

谢谢你呀,花这么长时间跟我解释。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-11 00:07:44 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-7-11 11:14 编辑

把mov ax,[2000h]看成mov ax,2000h了
编辑下





不用谢啦,最近很闲。概括啊,应该就是将[2000h](09h)*10h(或者说左移4位)然后把[200h-2001h](0390h)÷10h(或者说右移4位)最后将结果存放到2000h-2001h这段内存中吧




我晕差点误导别人。。。。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
Dardy + 1 + 1 + 1 助人为乐,欢迎常来

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-11 02:59:53 | 显示全部楼层
MOV CL,4
MOV AX,〔2000H〕  //AX = 03 09
SHL AL,CL                //AX = 03 90
SHR AX,CL               //AX = 00 39
MOV 〔2000H〕,AX
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-11 16:26:51 | 显示全部楼层
Dardy 发表于 2013-7-11 02:59
MOV CL,4
MOV AX,〔2000H〕  //AX = 03 09
SHL AL,CL                //AX = 03 90

主要是功能呀,这功能好像不怎么容易概括。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-12 00:58:48 | 显示全部楼层
说简单一点,左右移动就是乘它的进制,以十进制来说,你就明白,5*10=50等同5向左移一位,5*100=500等同5向左移二位,十六进制就是乘16,二进制就是乘2,来表示移位,这样一说,你就明白啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-12 18:00:38 | 显示全部楼层
左移左移是为了实现取出某一位的数据!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-16 11:42:57 | 显示全部楼层
嗯是的。就是乘进制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-18 23:18:31 | 显示全部楼层
感动,感动到眼泪就快出来了,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-17 10:35:09 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表