|
主题 : : 检测点14.2 [待解决] |
回复[ 10次 ]
点击[ 1561次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-11-13 09:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2010-10-25 00:34 |
|
|
|
|
|
[第2楼]
[ 回复时间:2011-03-06 09:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-02-19 15:14 |
关于cl是不是3的问题,要看你的程序执行顺序是什么样的,楼主的程序的CL=2是合理的 | | |
|
|
|
|
[第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不知道为什么写在这. 应该是用于测试结果正不正确. | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-11-15 23:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2011-11-03 09:29 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第7楼]
[ 回复时间:2013-06-22 23:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |