王爽 汇编 检测点 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存储低位.