602201038 发表于 2013-7-10 14:20:35

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

MOV CL,4
MOV AX,〔2000H〕
SHL AL,CL
SHR AX,CL
MOV 〔2000H〕,AX
试问若程序执行前,数据段内(2000H)=09H,(2001H)=03H,则执行后有(2000H)=(?),(2001)=(?)该程序实现什么功能?

Dardy 发表于 2013-7-10 15:46:04

本帖最后由 Dardy 于 2013-7-10 15:47 编辑

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

每左移一位相当于乘以2,左移4位相当于乘以16
每右移一位相当于除以2

メ㊣逆ご帅☆ 发表于 2013-7-10 21:57:44

本帖最后由 メ㊣逆ご帅☆ 于 2013-7-11 11:10 编辑

抱歉看错了编辑下
把mov ax,
看成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 ,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就可以实现我们要的东西了
当然还有其他运用,比如加密解密之类的

メ㊣逆ご帅☆ 发表于 2013-7-10 22:07:46

比较啰嗦了点。希望你不要介意哈。这样讲应该比较好懂

602201038 发表于 2013-7-10 22:58:04

Dardy 发表于 2013-7-10 15:46 static/image/common/back.gif
执行后有=39H,=00H
不知道怎么概括这段代码的功能。



恩恩,我们作业居然要概括功能,这个我也搞不清楚

602201038 发表于 2013-7-10 22:59:12

メ㊣逆ご帅☆ 发表于 2013-7-10 21:57 static/image/common/back.gif
MOV CL,4
MOV AX,〔2000H〕
SHL AL,CL


谢谢你呀,花这么长时间跟我解释。。。

メ㊣逆ご帅☆ 发表于 2013-7-11 00:07:44

本帖最后由 メ㊣逆ご帅☆ 于 2013-7-11 11:14 编辑

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





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




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

Dardy 发表于 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

602201038 发表于 2013-7-11 16:26:51

Dardy 发表于 2013-7-11 02:59 static/image/common/back.gif
MOV CL,4
MOV AX,〔2000H〕//AX = 03 09
SHL AL,CL                //AX = 03 90


主要是功能呀,这功能好像不怎么容易概括。。。

怡静 发表于 2013-7-12 00:58:48

说简单一点,左右移动就是乘它的进制,以十进制来说,你就明白,5*10=50等同5向左移一位,5*100=500等同5向左移二位,十六进制就是乘16,二进制就是乘2,来表示移位,这样一说,你就明白啦。

刀下留人 发表于 2013-7-12 18:00:38

左移左移是为了实现取出某一位的数据!

海豚c 发表于 2013-7-16 11:42:57

嗯是的。就是乘进制

欠你的幸福 发表于 2013-7-18 23:18:31

感动,感动到眼泪就快出来了,,

阔怀 发表于 2015-8-17 10:35:09

{:1_1:}
页: [1]
查看完整版本: 刚刚开始自学汇编,左移右移一般实现什么功能