1 ;解决除法溢出的子程序,(商为32位时的溢出) 2 assume cs : codesg, ds : datasg, ss : stacksg 3 4 datasg SEGMENT 5 db 'welcome to masm!' 6 datasg ENDS 7 8 stacksg SEGMENT 9 dw 8 dup (0) 10 stacksg ENDS 11 12 codesg SEGMENT 13 14 15 start: 16 mov ax, stacksg 17 mov ss, ax 18 mov sp, 16 19 20 mov ax, 4240h 21 mov dx, 0fh 22 mov cx, 0ah 23 24 call divdw 25 26 mov ax, 4c00h 27 int 21h 28 29 divdw: push ax ;保存低位被除数 30 ;以下3行计算高位除以除数的得数和余数,分别在ax,dx里 31 mov ax, dx 32 mov dx, 0 33 div cx 34 35 mov si, ax ;高位商,即溢出部分 36 ;下2行计算不会出现溢出,dx为高位除法过后的余数即新的高位,ax任为原来的地位 37 pop ax 38 div cx 39 ;把余数赋给cx,除数高位在dx,地位在ax 40 mov cx, dx 41 mov dx, si 42 ret 43 codesg ENDS 44 END start