. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->端口
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点14.2  [待解决] 回复[ 10次 ]   点击[ 1561次 ]  
masmaster
[帖 主]   [ 发表时间:2010-06-22 18:39 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
1 assume  cs:code
  2 code    segment
  3 start:
  4         mov ax,1234
  5         mov cl,2
  6         shl ax,1
  7         mov dx,ax
  8         shl ax,cl
  9         add ax,dx
 10 ;       mov ax,1234
 11 ;       mov bx,10
 12 ;       mul bx
 13         mov ah,4ch
 14         int 21h
 15 code    ends
 16         end     start
hohos
[第1楼]   [ 回复时间:2010-11-13 09:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2010-10-25 00:34
cl应该是3吧
mapking
[第2楼]   [ 回复时间:2011-03-06 09:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-19 15:14
关于cl是不是3的问题,要看你的程序执行顺序是什么样的,楼主的程序的CL=2是合理的
rotapple
[第3楼]   [ 回复时间:2011-08-26 21:46 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
to: hohos
为什么一定要是3呢.
他的程序是对的.只是变通了一下而已.
如果在一开始就初始化mov dx,ax的话,的确是要mov cl,3
但是他是先ax*=2然后再mov dx,ax的,所以再ax*=4(shl,2)再加上dx就行了.
一样的效果.
后面的mul bx不知道为什么写在这. 应该是用于测试结果正不正确.
zhujinwu
[第4楼]   [ 回复时间:2011-11-15 23:01 ]   [引用]   [回复]   [ top ] 
荣誉值:15
信誉值:0
注册日期:2011-11-03 09:29
楼主真是个善于变通的人。向你学习。
linyu0723
[第5楼]   [ 回复时间:2013-06-22 23:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
楼主的做法是对,但我认为不是最好,原因有2点:
第一,不易于理解,第一次*2,第二次就是*4了,别人看了有可能不易于理解,我也看了好长时间才看懂(可能是我水平有限)
第二,程序没有通用性,如果是ax*1000,你会怎么办,如果按楼主的做法,估计要写好长,即使能写完,代码估计也不是我等之辈能看懂的了。

现在把我写的代码分享给大家,如果需要改进,忘大家跟帖,以便大家共进步:


assume  cs:code 
code    segment 
start: 
       mov ax,1234
       mov bx,ax
       mov cx,5    ;如果是ax*1000,cx改成500即可。
       mov dx,0    ;dx清0,相当于一个累加器。

       s:
       mov ax,bx   ;每执行一次loop,ax恢复原值
       shl ax,1    ;ax*2
       add dx,ax   ;用dx累加ax*2的内容
       loop s
       mov ax,dx   ;最终结果放入ax

       mov ah,4ch 
       int 21h 

code    ends 
end     start
linyu0723
[第6楼]   [ 回复时间:2013-06-22 23:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
哎,这条指令是多余的,mov ax,dx   ;最终结果放入ax,改进一下程序:

 
assume  cs:code 
code    segment 
start: 
       mov dx,1234
       mov bx,dx
       mov cx,5    ;如果是dx*1000,cx改成500即可。
       mov ax,0    ;ax清0,相当于一个累加器。

       s:
       mov dx,bx   ;每执行一次loop前,dx恢复原值
       shl dx,1    ;dx*2
       add ax,dx   ;用ax累加dx*2的内容
       loop s
       
       mov ah,4ch 
       int 21h 

code    ends 
end     start
linyu0723
[第7楼]   [ 回复时间:2013-06-22 23:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
改进后的程序,体现出了ax是累加器。
hky987654321
[第8楼]   [ 回复时间:2013-08-30 16:39 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
根据检测点14.2的要求,用“加法”和“移位指令”计算(ax)=(ax)*10,

简单地用5个(ax)*2相加即可。乘法和循环,在这里没必要了。

assume cs:code
code segment

mov ax,1234h   ;为ax赋值                      
shl ax,1      ;移位得到(ax)*2 
mov bx,ax     ;转存1个(ax)*2于bx中
                                                
add ax,ax     ;得到2个(ax)*2相加
add ax,ax     ;得到4个(ax)*2相加
add ax,bx     ;得到5个(ax)*2相加
                                                
mov ax,4c00h
int 21h
code ends
end
hky987654321
[第9楼]   [ 回复时间:2013-08-30 21:28 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
如果不是1234这种较小数,考虑CF问题,则多几行代码,但思路仍然是(ax)*10=(ax)*2*5即5个(ax)*2相加。

assume cs:code
code segment
mov ax,0ffffh   ;为ax赋值 
mov bx,5                            
sub dx,0        ;清0                

shl ax,1        ;移位后,ax存放(ax)*2的低16位
adc dx,0        ;取出CF,存放ax移位后的高16位。完成1次(ax)*2
push ax         ;低16位入栈
                                                
mov ax,dx       
mul bx          ;移位后的高16位乘5
mov cx,ax
pop ax
mul bx
add dx,cx       ;完成5个(ax)*2相加
                                                
mov ax,4c00h
int 21h
code ends
end
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved