69,369
社区成员
发帖
与我相关
我的任务
分享
;以下计算1到10000的和
xor ax, ax
xor dx, dx
mov cx, 10000
@f:
add ax, cx
adc dx, 0
loop @f
;以下计算累加和的每个数位
xor cx, cx
mov ss, cx ;设置堆栈段的段基址
mov sp, cx
mov bx, 10
xor cx, cx
@d:
inc cx
mov bp, ax
mov ax, dx
xor dx, dx
div bx
xchg bp, ax
div bx
or dl, 0x30
push dx
mov dx, bp
cmp dx, 0
jne @d
cmp ax, 0
jne @d
第一次, 商 qh (在AX中)余数是 rh'
第二次, 商 ql 余数是 remain
所以两次除法,足够了。
只是需要把 qh (在AX中)处理好---存放到商的高位
XL取到 AX中 rh'(在DX中不动),,接着用于第二次除法
qh ql
------------
y ) 0 xh xl 第一次除法 DX=0,AX=xh
..
--------------
rh' xl 第二次除法 DX=rh',不动,AX=xl
......
--------
remain 余数在DX中
就可以了,所以不是很复杂
就是第一次,DX初始化为0
然后,自高向低,依次取出X 的各16Bits,放入 AX寄存器中,开始除。
这就像10进制的多位数除1位数,实际上还是比较简单的。
这是除法指令,设计出来就是这样的效果。
如果是高级语言,就比较麻烦了;
汇编语言一次计算,可以得到商和余数。
所以,比较简单。
大概代码如下:
Mov DX,0
Mov AX,x+2
mov BX ,y
div BX ;第1次除法
mov q+2,AX
mov AX,x
div BX ;第2次除法
mov q,AX
mov remain,DX