汇编网首页登录博客注册
mqmelon的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
友情链接

[2012-12-05 11:26] 第10章 实验2 - 非溢出除法

好几天都在想如何去做(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
评论次数(1)  |  浏览次数(802)  |  类型(汇编作业) |  收藏此文  | 

[  sbjcm33   发表于  2012-12-06 01:34  ]

原来你是把实验1和2放一起的,好办法,我怎么没想到呢,把它们分成了两个程序。
具体的内容我就不看了,因为我自己的还没贴出来,怕看了受影响。明天把实验一做完了再来学习。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码