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

目录
  • 问题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实现

assume cs:code
	code segment
		mov ax,2
		add ax,ax
		;实现程序的返回
		mov ax,4c00h
		int 21h
	code ends
end

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

分析:用loop实现

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次的计算次数比较少,节约计算资源

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位相加即可

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相加

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、同时需要两个寄存器分别保存和修改其中的内容

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

以上就是汇编语言功能用循环累加实现乘法的详细内容,更多关于汇编语言循环累加实现乘法的资料请关注我们其它相关文章!

(0)

相关推荐

  • 用汇编语言实现从1加到100的方法(1+2+...+100)

    用汇编语言实现1+2+...+100 ;课堂作业 ;计算1+2+...+100 DATA SEGMENT COUNT DW 0 ;计数 DATA ENDS STACK SEGMENT PARA STACK BUF DW 20H DUP (0) LEN EQU $-BUF STACK ENDS CODESEG SEGMENT ASSUME CS:CODESEG,SS:STACK,DS:DATA START: ;初始化堆栈段ss和数据段ds MOV AX,STACK MOV SS,AX MOV SP

  • 一位数乘法的汇编语言实现方法

    使用的是16位微程序设计,指令为TEC-2000 16位教学计算机的指令系统 要实现的功能:通过键盘键入一个数字,接收之后显示出来,然后自动补上*号,接着再次键入一个数字,然后自动补上=号,接着输出运算结果. 本文章实现,主程序:通过调用前面的几个子程序,实现最终要实现的功能. 关键字解释 CALA ADR:CIN 表示调用子程序CIN,ADR表示要输入子程序CIN的起始地址 主程序代码 //主程序 CALA ADR:CIN //调用子程序,读入一个数字字符 MVRR R1,R0 //将读入的数

  • 详解汇编语言各种指令的解释与用法

    [数据传输指令] 一.通用数据传送指令 1.传送指令MOV(move) 指令的汇编格式:MOV DST,SRC 指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址.指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令.指令的执行对标志位的影响:不影响标志位.指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器:目的操作数DST不能是CS,也不能用立即数方式. 2.进栈指令 PUSH(push onto the sta

  • 汇编语言乘指令 MUL、IMUL的具体使用

    MUL: 无符号乘 ================================================== ;影响 OF.CF 标志位 ;指令格式: ;MUL r/m  ;参数是乘数 ;如果参数是 r8/m8,   将把  AL 做乘数, 结果放在 AX ;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX ;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX 当乘积的高半部分(AH.DX.EDX.RDX)中存有结果的有效数字,则CF=

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

    目录 问题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

  • 汇编语言功能字符串大小写转换实现实例详解

    目录 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写 问题2:将data段中每个单词的头一个字母改成大写字母 问题3:将data段中每个单词改为大写字母 问题4:将data段中每个单词的前4个字母改为大写字母 问题5:设计一个子程序,将一个全是字母的字符串转化成大写 问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写 复杂一点的对结构化数据的版本 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写 分析: 如何转换成大小写 如果利用A

  • 汇编语言功能实现数据复制实例详解

    目录 问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中 问题2:将"mov ax,4c00h"之前的指令复制到内存0:200处 问题3:将程序中定义的数据逆序存放 问题4:将字符串"welcome to masm"复制到它后面的数据区中 问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中 分析 1.0:200~0:20b单元如何表示 0020:0~0020:b可以等同于以上单元,而且单元的偏移

  • Python用for循环实现九九乘法表

    下面通过一段代码给大家介绍python 使用for 循环实现九九乘法表,具体代码如下所示: #for 循环实现99乘法表 for i in range (1,10): for j in range (1,i+1): print("{}*{} = {:<4}".format(i,j,i*j),end = " ") print("") print('第1种'+"-"*96) for i in range (9,0,-1):

  • 汇编分析 Golang 循环(推荐)

    女主宣言 今天小编为大家分享一篇关于Golang循环汇编分析的文章,文章中介绍了golang循环的汇编层面的处理,通过分析,我们可以更了解循环的实现.希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在" 3 60云计算 ",点关注哦! 循环是编程中很强大的一个概念,而且非常容易处理. 但是,必须将其翻译成机器可理解的基本指令. 它的编译方式也可能影响标准库中的其他组件. 让我们开始分析一下范围循环 . 1循环汇编 范围循环可以迭代数组,切片或通道.下面函数展示了,对分

  • Java lambda 循环累加求和代码

    java 8 stream 提供了下面几种类型的求和 Stream::mapToInt Stream::mapToDouble Stream::mapToLong public void test() { List<Person> people = new ArrayList<>(); people.add(new Person("zhangsan",20)); people.add(new Person("lisi", 26)); peop

  • C语言规律循环累加求和案例

    我就废话不多说了,大家还是直接看代码吧~ #include <stdio.h> void main(){ int i; float a,b,c,d,t; a = 1.0; b = 2.0; i = 1; t = 0; for (i = 1; i <= 20; i++) { if (i < 2){ c = b / a; t = c+t; a = a + 1; b = b + 1; //第一项不符合规律 } else { c = b / a; t = t + c; d = a; a =

  • 一文秒懂汇编中的循环问题

    汇编系列其实也在一直更新,只不过更新的频率会挺慢的...由于白天一直忙于工作,空闲时间还要看书.学习各种技术栈,早上也要抽时间早期健身,晚上回家还要陪家人 + 学习,时间安排的满满当当,所以我就慢慢写,各位读者也别太着急,我其实真想再分一个自己出来. 之前的文章中介绍过 [0] 表示的是内存单元,它一般存储在 ds 寄存器中,偏移地址为 0 .比如下面的指令 mov ax,[0] 就是将一个内存单元的内容送入 ax,这个内存单元的长度为 2 个字节,正好存放一个字型数据,偏移地址为 0 ,段地址

  • Python使用while循环花式打印乘法表

    花式打印9*9乘法表 #第一个计数器 i = 1 while i < 10: #第二个计数器 j = 1 while j <= i: print('%d*%d=%d\t' %(j, i, i*j) , end=('')) j +=1 #换行 print('') i +=1 #输出换行 print('') i = 1 while i <= 9: k = 8 j = 1 while k >= i: print('\t\t', end=('')) k -= 1 while j <=

  • 利用Python循环(包括while&for)各种打印九九乘法表的实例

    一.for循环打印九九乘法表 #注意:由于缩进在浏览器不好控制,请大家见谅,后续会有图片传入. 1.1 左下角 for i in range(1,10): for j in range(1,i+1): print('%d*%d=%2d\t'%(j,i,i*j),end='') print() 效果图: 1.2 右下角 for i in range(1,10): for k in range(i+1,10): print(end=' ') #此处为返回八个空格,请注意 for j in range

随机推荐