王爽 汇编 检测点 14.2

1.程序说明

  编程,用加法和移位指令计算(ax)=(ax)*10.

  提示, (ax)*10=(ax)*2+(ax)*8.

2.程序描述

  因为看其他人的答案,都发现不是很完美,没有考虑进位,最后答案会有很大的偏差.所以自己写下自己的想法

  (1) 如果ax足够大,那么ax*10的结果在ax中就无法保存.我们必须用另一个寄存器存储高位的值.

  用dx存储ax*2的值  bx存储进位.    

3.代码

 1 assume cs:code
 2 code segment
 3     start:
 4         mov ax,5345h
 5         mov bx,0    ;bx存储ax左移的进位值
 6         mov dx,ax    ;bx存储最开始的ax值
 7         ;ax*8 将ax左移3位,因为每左移一次都可能进位,所以选择用循环
 8         mov cx,3
 9     s1:    
10         shl bx,1    ;先将高位*2,再将低位*2
11         shl ax,1
12         adc bx,0    ;将低位进位值加到高位
13         loop s1
14         
15         shl    dx,1    ;计算 ax*2
16         adc bx,0
17                     
18         add ax,dx    ;ax*8+ax*2 
19         adc bx,0
20             
21         s:            ;无限循环,防止退出
22             jmp short s
23         mov ax,4c00h
24         int 21h
25 code ends
26 end start

4.结果 

   5345h*10 最后的结果就是340B2h,bx存储高位,ax存储低位.

原文地址:https://www.cnblogs.com/Triomphe/p/8694754.html