好几天都在想如何去做(H/N)*65536,后来看了看大家的做法,又读了几回书,才终于明白。原来(H/N)*65536就是高位。天!看来还是思维方式有问题呀。
;主程序
DATAs segment
db 'Welcom to masm!',0
DATAS ends
STACKS SEGMENT
;此处输入堆栈段代码
dw 16 dup (0)
STACKS ENDS
CODES segment
ASSUME CS:CODES,DS:DATAS,SS:STACKS
start:
MOV AX,DATAS
MOV DS,AX
mov ax,STACKS
mov ss,ax
;此处输入代码段代码
;测试显示字串
mov dh,8 ;行
mov dl,3 ;列
mov cl,2 ;颜色
mov si,0 ;首地址
call show_str
;测试非溢出除法
mov ax,4240h
mov dx,0000fh
mov cx,0Ah
call divdw
mov ax,4c00h
int 21h
;显示字串子程序
;显示字符串到指定位置
;函数名称:show_str
;函数功能:在指定位置用指定颜色显示一个用0结束的字符串
;函数参数:(dh)=行号0-24,(dl)=列号0-79,(cl)=颜色,ds:si为字串首地址
show_str:
;入栈
push es
push ax
push bx
push di
push cx
;显存地址
mov ax,0B800H
mov es,ax
mov di,0 ;行列偏移地址
;
mov ax,0a0h ;行偏量
dec dh ;行减1
mul dh ;计算行偏移
mov di,ax ;将行偏移保存在di中
;
mov ax,2h
dec dl ;列减1
mul dl ;计算列偏移
add ax,di
mov di,ax
;
mov bh,cl ;属性
;
showOne:
mov bl,ds:[si] ;取一个字母
mov cl,bl ;判断是否为0
mov ch,0
jcxz OK
;mov es:[di+ax],bx ;显示到屏幕上
mov es:[di],bx
inc si ;到下一个字母位置
add di,2 ;列移2个位置到下一列
jmp showOne ;循环
OK:
;出栈
pop cx
pop di
pop bx
pop ax
pop es
;返回
ret ;显示字串子程序show_str结束
;显示子程序结束
;
;非溢出除法
;公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
;该公式的意思表示为:高16位除以除数时,得到其商和余数,其中的余数正好是下一次16位除法时的高16位。
;16位除法DX中为被除数高位(H);AX中为被除数低位(L);其结果中AX中为商,DX中为余数;
divdw:
;保存现场
push bx
;开始第一次除法
push ax ;保存被除数中的低16位,该数据在ax中
mov ax,dx ;将被除数中的高16位放在ax中,然后将dx置0,此时(dx)(=0)+(ax)即为第一次除法的被除数
mov dx,0 ;第一次除法时的被除数,高位置0
div cx ;第一次除法时的除数
;第一次除法结束时,ax中为商,即dx中余数,此时的余数就是第二次除法中的高16位
mov bx,ax ;保存第一次除法时的商,即总结果中的高16位商
pop ax ;总被除数中低16位出场
div cx ;第二次除法
mov cx,dx ;第二次除法中的余数,即总结果中的余数
mov dx,bx ;第一次结果中保存的商中的高16位
divExit: ;子程序退出
pop bx
ret ;子程序结束
CODES ends
end start
- [sbjcm33] 原来你是把实验1和2放一起的,好办法,我怎么没想到呢,把它们分成了两个程序。 具体的内容我就不看了 12/06 01:34
- [rotapple] 却没有放入段地址,而此处要明确的是:seg code 的含义是指段地址 ============= 06/23 16:56
- [Wednesday] 分析透彻,收藏!哈哈 11/09 17:26
- [Wednesday] 公布答案了,哈哈。 11/05 23:03
- [mqmelon] 不用客气,共同进步! 11/02 10:03
- [feemess] 谢谢指点.我的下一次答题要在32个小时之后了.一直都认为第一题没错.看来.要认真看书才是 10/28 00:08
- [mqmelon] 谢谢,我会努力去做. 10/27 23:18
- [游客] mqmelon同学,你能有这样的认识首先说明你的学习态度是对的,只要有正确的学习态度,就能够学好,以 10/25 11:56
- [sunshine] 呵呵 10/25 09:49
- [mqmelon] 谢谢,十分谢谢。 10/24 17:10