金建强 發表於 2021-11-4 15:19:24

汇编语言功能用循环累加实现乘法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>问题1:编程计算2的2次方,结果存在ax中</li><ul class="second_class_ul"><li>分析:用2+2实现</li></ul><li>问题2:编程实现2的12次方</li><ul class="second_class_ul"><li>分析:用loop实现</li></ul><li>问题3:编程实现123*236,结果存在ax中</li><ul class="second_class_ul"><li>分析:用236相加123次的计算次数比较少,节约计算资源</li></ul><li>问题4:计算ffff:0006单元中的数乘以3,结果存储在dx中</li><ul class="second_class_ul"><li>1、判断数据是否能够存储</li><li>2、判断数据相加是否能够位数相同</li></ul><li>问题5:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中</li><ul class="second_class_ul"><li>1、运算的结果是否超出寄存器的范围</li><li>2、能否直接相加dx中的数据</li></ul><li>问题6:计算data段中第一组数据的3次方,结果保存在后面一组的dword单元中</li><ul class="second_class_ul"><li>1、需要利用一个子程序包装出计算的功能</li><li>2、同时需要两个寄存器分别保存和修改其中的内容</li></ul></ul></div><p class="maodian"></p><h2>问题1:编程计算2的2次方,结果存在ax中</h2>
<p class="maodian"></p><h3>分析:用2+2实现</h3>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
        code segment
                mov ax,2
                add ax,ax
                ;实现程序的返回
                mov ax,4c00h
                int 21h
        code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题2:编程实现2的12次方</h2>
<p class="maodian"></p><h3>分析:用loop实现</h3>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
        code segment
                mov ax,2               
                mov cx,11        ;设置循环次数,只需相加11次
                s:add ax,ax
                loop s
                mov ax,4c00h
                int 21h
        code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题3:编程实现123*236,结果存在ax中</h2>
<p class="maodian"></p><h3>分析:用236相加123次的计算次数比较少,节约计算资源</h3>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
        code segment
                mov ax,236
                mov cx,122
                s:add ax,ax
                loop s
                mov ax,4c00h
                int 21h
        code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题4:计算ffff:0006单元中的数乘以3,结果存储在dx中</h2>
<p>分析:</p>
<p class="maodian"></p><h3>1、判断数据是否能够存储</h3>
<p>因为内存单元中存储的是字节型数据,范围在0~255之间,乘上8之后不会大于16位dx寄存器的存储范围0~65535</p>
<p class="maodian"></p><h3>2、判断数据相加是否能够位数相同</h3>
<p>内存单元是字节单元,如果用寄存器直接相加,数据的长度不一样,所以需要将寄存器变成8位,则只需要将高8位设置为0,用低8位相加即可</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
code segment
        ;设置地址指向为ffff:0006
        mov ax,0ffffh   ;字母开头的常量前面需要加0
        mov ds,ax
        mov bx,6        ;ds:bx则为数据的指向
        mov al,ds:
        mov ah,0
        mov dx,0        ;初始化寄存器中的内容
        mov cx,3        ;因为不是自身相加,所以需要3次
        s:add dx,ax
        loop s
        mov ax,4c00h
        int 21h                ;程序返回

code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题5:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中</h2>
<p>分析:</p>
<p class="maodian"></p><h3>1、运算的结果是否超出寄存器的范围</h3>
<p>12个字节型数据的相加,结果不会超过65535</p>
<p class="maodian"></p><h3>2、能否直接相加dx中的数据</h3>
<p>8位的数据不能直接相加到16位的寄存器中,如果用低8位进行相加,结果可能会超出8位存储的范围,所以只能先将数据存放到16位的寄存器中,在与dx相加</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
code segment
        mov ax,0ffffh
        mov ds,ax
        mov bx,0        ;ds:bx指向ffff:0
        mov dx,0
        mov cx,12        ;12次到ffff:b
s:        mov al,ds:
        mov ah,0
        add dx,ax        ;利用ax进行相同位数的相加
        inc bx                 ;向后移动一个单元
        loop s
        mov ax,4c00h
        int 21h

code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题6:计算data段中第一组数据的3次方,结果保存在后面一组的dword单元中</h2>
<p>分析:</p>
<p class="maodian"></p><h3>1、需要利用一个子程序包装出计算的功能</h3>
<p class="maodian"></p><h3>2、同时需要两个寄存器分别保存和修改其中的内容</h3>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        dw 1,2,3,4,5,6,7,8
        dw 8 dup(0)
data ends
code segment
start:        mov ax data
                mov ds,ax
                mov si,0                ;ds:si指向第一组word单元
                mov di,16                ;ds:di指向第二组dword单元
                mov cx,8
s:                mov bx,ds:
                call cube
                mov ds:,ax                ;计算的结果低16位保存在ax中
                mov ds:,dx        ;计算的结果高16位保存在dx中
                add si,2                ;ds:si指向下一个word单元
                add di,4                ;ds:di指向下一个dword单元
                loop s
                mov ax,4c00h
                int 21h
cude:        mov ax,bx
                mul bx
                mul bx
                ret

code ends
end start</pre>
</div>
<p>以上就是汇编语言功能用循环累加实现乘法的详细内容,更多关于汇编语言循环累加实现乘法的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编语言MUL指令无符号数乘法的使用</li><li>一位数乘法的汇编语言实现方法</li><li>汇编高效乘法运算的具体使用方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言功能用循环累加实现乘法