吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4260|回复: 4
收起左侧

[其他原创] 【笔记】X86 (16位) 汇编笔记【防除法溢出】

[复制链接]
lcmystery 发表于 2016-4-30 13:19
本帖最后由 lcmystery 于 2016-4-30 13:24 编辑

[Asm] 纯文本查看 复制代码
;
;解决除法溢出,公式:被除数高16位/除数*65536+(被除数高16位%除数*65536+被除数低16位)/除数 
;
;                                                *****消除除法溢出********
;                                                div,mul——除法,乘法指令
assume cs:code,ds:data,ss:stack
        data segment
        dw 000fh,4240h,000ah,0000h,0001h ;默认dx存储被除数的高16位,ax存放低16位(除数为16位时)。

   dw  10 dup (0)
        data ends
        
        stack segment
        dw 20 dup (0)
        stack ends
        
        code segment
        start:mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,20h
                
                call _div
                                
                mov ax,4c00h
                int 21h
                
_div:
        mov ax,ds:[0]
        div word ptr ds:[4]
        mov ds:[10],ax
        mov ax,ds:[2]
        div word ptr ds:[4]
        mov ds:[12],ax
        
        ret 

        code ends

end start
        


上面是正确的编程。debug调试正确。


唉,开始做这实验,直接就按照公式编程,结果、、、、、
后来仅都 调试不对,仔细分析后发现、、、、太 坑爹了、、、

下面也是正确的编程,但是debug调试会得到错误的结果。


[Asm] 纯文本查看 复制代码
;
;解决除法溢出,公式:被除数高16位/除数*65536+(被除数高16位%除数*65536+被除数低16位)/除数 
;
;                                                *****消除除法溢出********
;                                                div,mul——除法,乘法指令
assume cs:code,ds:data,ss:stack
        data segment
        dw 000fh,4240h,000ah,0000h,0001h ;默认dx存储被除数的高16位,ax存放低16位(除数为16位时)。
        data ends
        
        stack segment
        dw 20 dup (0)
        stack ends
        
        code segment
        start:mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,20h
                
                call _div

                 mov ax,0100h
                 int 21h
                mov ax,4c00h
                int 21h
                
        _div:
                mov ax,0
                mov al,ds:[0]
                mov cx,ds:[4]
                
                div cl
                
                push ax ;商和余数
                mov ah,0
                mov cx,ds:[8]
                mul cl
                mov dx,0
                mov dx,ax
                push ax ;低16位
                push dx ;高16位>>sp:18h
                mov sp,1ch
                pop ax ;商和余数
                mov al,0
                mul cx
                mov cx,0
                mov dx,ax
                mov ax,0
                adc ax,ds:[2]
                mov cx,ds:[4]
                ;mov dx,0
                div cx

                mov sp,18h
                pop cx
                add dx,cx ;高位相加
                pop cx
                add ax,cx ;低位相加
                mov sp,1eh

        ret
        code ends

end start
        


为什么呢?

原来debug提供单步调试。即单步中断。中断前总会把cs:ip都压入栈中,去执行中断程序。而且压入的栈段会共享你设置的栈段。(这样你进行mov sp,**)如果 ** 位于当前 sp的后面就会覆盖掉 原来栈段内的内容。



1.png
2.png
3.png
4.png
11.png

免费评分

参与人数 1热心值 +1 收起 理由
Cizel + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lcmystery 发表于 2016-4-30 13:21
本帖最后由 lcmystery 于 2016-4-30 13:25 编辑

不喜勿喷啊。如果表述不完整,请见谅啊。谢谢。
wangqiustc 发表于 2016-4-30 13:37
Anyson 发表于 2016-4-30 15:38
TaiLan 发表于 2016-5-2 22:55
感谢分享。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 13:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表