汇编语言实现功能(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
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的51单片机汇编语言实现千以内的乘除法计算器的示例代码: ``` ORG 0H MOV P0,#0FFH ;设置P0口为输入口 MOV P1,#0H ;设置P1口为输出口 MOV P2,#0H ;设置P2口为输出口 MAIN: ACALL READ_NUM1 ;读取第一个数字 ACALL READ_NUM2 ;读取第二个数字 ACALL READ_OP ;读取运算符 ACALL CALC ;计算结果 ACALL DISPLAY ;显示结果 SJMP MAIN READ_NUM1: MOV R0,#4 ;设置循环次数 MOV A,#0H ;清零累加器 LOOP1: MOV C,P0.0 ;读取P0.0口的值 JNC LOOP1 ;等待输入 ACALL DELAY ;延时去抖 MOV C,P0.0 ;再次读取P0.0口的值 JNC LOOP1 ;等待输入 ADD A,#0FH ;十进制转换 MOV B,A ;保存累加器的值 MOV A,P0 ;读取输入值 ANL A,#0FH ;取低四位 ADD A,B ;加上之前的结果 MOV B,A ;保存结果 DJNZ R0,LOOP1 ;循环4次结束 RET READ_NUM2: MOV R0,#4 ;设置循环次数 MOV A,#0H ;清零累加器 LOOP2: MOV C,P0.0 ;读取P0.0口的值 JNC LOOP2 ;等待输入 ACALL DELAY ;延时去抖 MOV C,P0.0 ;再次读取P0.0口的值 JNC LOOP2 ;等待输入 ADD A,#0FH ;十进制转换 MOV B,A ;保存累加器的值 MOV A,P0 ;读取输入值 ANL A,#0FH ;取低四位 ADD A,B ;加上之前的结果 MOV B,A ;保存结果 DJNZ R0,LOOP2 ;循环4次结束 RET READ_OP: MOV R0,#10 ;设置循环次数 LOOP3: MOV C,P0.0 ;读取P0.0口的值 JNC LOOP3 ;等待输入 ACALL DELAY ;延时去抖 MOV C,P0.0 ;再次读取P0.0口的值 JNC LOOP3 ;等待输入 MOV A,P0 ;读取输入值 CPL A ;取反 ANL A,#0FH ;取低四位 CJNE A,#0CH,LOOP3 ;如果输入的不是*或/,重新输入 MOV B,A ;保存运算符 RET CALC: MOV A,B ;读取运算符 CJNE A,#0CH,MUL1 ;如果是*,跳转到MUL1 MOV A,R1 ;读取第一个数字 DIV AB ;除以第二个数字 MOV R3,A ;保存商 MOV R4,B ;保存余数 SJMP CALC_END MUL1: MOV A,R1 ;读取第一个数字 MUL AB ;乘以第二个数字 MOV R3,A ;保存乘积的低8位 MOV R4,B ;保存乘积的高8位 CALC_END: RET DISPLAY: MOV A,R3 ;读取结果的低8位 MOV B,R4 ;读取结果的高8位 MOV R0,#4 ;设置循环次数 LOOP4: MOV C,#0AH ;除以10 DIV AB MOV P2,C ;输出余数 INC P1 ;P1口指向下一位 DJNZ R0,LOOP4 ;循环4次结束 RET DELAY: MOV R7,#0FFH DELAY_LOOP: DJNZ R7,DELAY_LOOP RET END ``` 这个程序通过检测P0.0口的状态,读取用户输入的数字和运算符,并通过P2口输出余数,P1口控制位数,从而实现了一个简单的千以内乘除法计算器。其中,乘法采用了MUL指令,除法采用了DIV指令,需要注意的是,DIV指令的第一个操作数必须是累加器A,除数在B寄存器中,商保存在A寄存器中,余数保存在B寄存器中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值