应邀写个汇编语言的除法子程序。
编写除法子程序,有两种算法,移位相减的方法和循环相减的方法。
移位相减的方法是仿照人们做除法的竖式编写,执行速度较快,但是计算的原理,一般人不好理解,难以让大家推广到更多的字节。故此下面采用循环相减的思路来编写程序。
设计思路:所谓除法,就是要求出在被除数中,含有多少个除数。那么就用被除数连续的减去除数,直到不够减为止,够减的次数,就是商,不够减的数值,就是余数。
下列程序,对数值范围的要求很宽松,被除数、除数和商,都可以是16位数,这比网上常见的16位除8位的除法程序,适用面要广得多。
注意,除数为0的问题,应该在主程序中进行检测。
;-------------------------------------
;16位/16位的子程序
;被除数:R2R3、除数:R4R5;商:DPTR、余数:R2R3。
;占用:A、B。
;-------------------------------------
R23DIVR45:
MOV DPTR, #0
D_LOOP:
CLR C
MOV A, R3
SUBB A, R5
MOV B, A
MOV A, R2
SUBB A, R4 ;R2R3-R4R5
JC DIV_E ;有借位转移
INC DPTR
MOV R3, B
MOV R2, A
SJMP D_LOOP
DIV_E:
RET ;不够减就结束
;-------------------------------------
;完
对于R2R3中的余数,还应该有个“四舍五入”的程序。
呵呵,我来抛砖,不知那位读者可以还玉?
关键字:汇编语言 16位除法
引用地址:
汇编语言的16位除法子程序
推荐阅读最新更新时间:2024-03-16 16:02
单片机60S倒计时汇编语言
ORG 0000H AJMP MAIN ORG 000BH AJMP INTT0 ORG 0030H MAIN: MOV R7,#60 MOV R6,#00H MOV DPTR,#TABLE MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH ;设置定时器工作方式、初值 SETB EA SETB ET0 SETB TR0 NEXT: MOV A,R7 MOV B,#0AH DIV AB SETB P1.3 MOVC A,@A+DPTR MOV P0,A CLR P1.4 ;开启shi位显示 ACALL DELAY MOV A,B
[单片机]
ARM汇编语言入门(二)
数据类型 与高级编程语言类似,ARM也支持操作不同的数据类型。 我们载入(load)或存储(store)的数据类型可以是有符号或无符号的字、半字或字节。这些数据类型的扩展符是:-h或-sh代表半字,-b和-sb代表字节,其中字没有扩展符号。有符号和无符号的区别: 有符号数据类型可以存储正数和负数,因此表示的值范围更小。 无符号数据类型可以存储大的正数(包含0),不能存储符数因此可以表示更大的数。 载入和存储指令使用数据类型: ldr = Load Word ldrh = Load unsigned Half Word ldrsh = Load signed Half Word ldrb = Load unsigned
[单片机]
不用定时器和汇编语言,只用C语言实现精确无误的延时
对于51定时器,却是有点少,有时候不经意间就被用完了,而实现定时又TM神坑了!一般的解决方案有直接上汇编,一条语句的执行时间就是一个机器周期,所以多写几个就实现了完美的定时功能。可是可是……..又有多少学51的会汇编呢?呵呵哒 所以来分享一个神好用的方法,C语言的while和nop结合使用实现精确延时 上调试代码: #include #include #define TIME 164//此处是需要不断调节的改变时间的数值 //164是少4个机器周期,165是多了2个机器周期 /* ∵晶振=12MHz ∴一条指令用时=1/(12/12)=10^(-6)s=1us */ //想办法补偿,而不是减少 void del
[单片机]
用汇编语言做一个看门狗测试
用STC的MCU的IO方式控制74HC595驱动8位数码管。 ; 用户可以修改宏来选择时钟频率. ; 显示效果为: 显示秒计数, 5秒后不喂狗, 等复位. Fosc_KHZ EQU 22118 ;22118KHZ STACK_POIRTER EQU 0D0H ; 堆栈开始地址 DIS_DOT EQU 020H DIS_BLACK EQU 010H DIS_ EQU 011H AUXR DATA 08EH P4 DATA 0C0H P5 DATA 0C8H P0M1 DATA 0x93 ; P0M0 DATA 0x94 ; P1M1 DATA 0x91 ; P1M0 DATA 0x92 ; P2M1 DATA 0x95 ; P2M0
[单片机]
51 汇编语言编程:变速计数
;用51单片机控制 2位数码管动态显示 00 ~ 99。 ;从 00 开始显示,显示数字每隔一段时间加 1,一直到 99,然后回到 00。 ;从 00 到 10 每隔 100ms 加 1; ;从 10 到 20 每隔 200ms 加 1; ;其它依此类推; ;从 90 到 99 然后到 00 每隔 1s 加 1。 ;做而论道用汇编语言编写的程序如下: ORG 0000H JMP MAIN ORG 000BH JMP T0_INT MAIN: MOV TMOD, #01H MOV TH0, #HIGH(65536-50000) MOV TL0, #LOW(65536-
[单片机]
ATPCS ARM体系中汇编语言和c语言之间参数传递规则
ATPCS ATPCS即ARM-THUMB procedure call standard的简称。 PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。 PCS强制实现如下约定:调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。 PCS的制订是一系列指标的 tradeoff(折衷) (因为很大程度上涉及系统的一些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编
[单片机]
51汇编语言指令集
符号定义表 符号 含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR (80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11
[单片机]
汇编语言 条件转移指令JCXZ
JCXZ若CX为0跳转 指令格式:JCXZ 标号 指令功能:若CX寄存器为0,则转义到指令中标号所指定的地址处,否则将往下顺序执行,它不对CX寄存器进行自动减1的操作。 assume cs:code, ds:data data segment db 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 data ends code segment start: mov bx, data mov ds, bx mov bx, 0 s: mov cx, 0 mov cl, ds: jcxz ok ; x = 0时,下面的2行代码不会被执行,会跳转到 ok
[单片机]