阅读 163

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

这篇文章主要为大家介绍了汇编语言实现功能,使用用循环累加来实现乘法,文中通过几个问题实例分析,来为大家进行详细讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助

目录
  • 问题1:编程计算2的2次方,结果存在ax中

    • 分析:用2+2实现

  • 问题2:编程实现2的12次方

    • 分析:用loop实现

  • 问题3:编程实现123*236,结果存在ax中

    • 分析:用236相加123次的计算次数比较少,节约计算资源

  • 问题4:计算ffff:0006单元中的数乘以3,结果存储在dx中

    • 1、判断数据是否能够存储

    • 2、判断数据相加是否能够位数相同

  • 问题5:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中

    • 1、运算的结果是否超出寄存器的范围

    • 2、能否直接相加dx中的数据

  • 问题6:计算data段中第一组数据的3次方,结果保存在后面一组的dword单元中

    • 1、需要利用一个子程序包装出计算的功能

问题1:编程计算2的2次方,结果存在ax中

分析:用2+2实现

1
2
3
4
5
6
7
8
9
assume cs:code
    code segment
        mov ax,2
        add ax,ax
        ;实现程序的返回
        mov ax,4c00h
        int 21h
    code ends
end

问题2:编程实现2的12次方

分析:用loop实现

1
2
3
4
5
6
7
8
9
10
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

问题3:编程实现123*236,结果存在ax中

分析:用236相加123次的计算次数比较少,节约计算资源

1
2
3
4
5
6
7
8
9
10
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

问题4:计算ffff:0006单元中的数乘以3,结果存储在dx中

分析:

1、判断数据是否能够存储

因为内存单元中存储的是字节型数据,范围在0~255之间,乘上8之后不会大于16位dx寄存器的存储范围0~65535

2、判断数据相加是否能够位数相同

内存单元是字节单元,如果用寄存器直接相加,数据的长度不一样,所以需要将寄存器变成8位,则只需要将高8位设置为0,用低8位相加即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
assume cs:code
code segment
    ;设置地址指向为ffff:0006
    mov ax,0ffffh   ;字母开头的常量前面需要加0
    mov ds,ax
    mov bx,6    ;ds:bx则为数据的指向
    mov al,ds:[bx]
    mov ah,0
    mov dx,0    ;初始化寄存器中的内容
    mov cx,3    ;因为不是自身相加,所以需要3次
    s:add dx,ax
    loop s
    mov ax,4c00h
    int 21h     ;程序返回
  
code ends
end

问题5:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中

分析:

1、运算的结果是否超出寄存器的范围

12个字节型数据的相加,结果不会超过65535

2、能否直接相加dx中的数据

8位的数据不能直接相加到16位的寄存器中,如果用低8位进行相加,结果可能会超出8位存储的范围,所以只能先将数据存放到16位的寄存器中,在与dx相加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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:[bx]
    mov ah,0
    add dx,ax   ;利用ax进行相同位数的相加
    inc bx      ;向后移动一个单元
    loop s
    mov ax,4c00h
    int 21h
  
code ends
end

问题6:计算data段中第一组数据的3次方,结果保存在后面一组的dword单元中

分析:

1、需要利用一个子程序包装出计算的功能

2、同时需要两个寄存器分别保存和修改其中的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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:[si]
        call cube
        mov ds:[di],ax      ;计算的结果低16位保存在ax中
        mov ds:[di+2],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

以上就是汇编语言功能用循环累加实现乘法的详细内容

原文链接:https://blog.csdn.net/hc1151310108/article/details/82724577


    文章分类
    版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
    相关推荐