• 数据处理的两个基本问题04 零基础入门学习汇编语言41


    第八章:数据处理的两个基本问题04

     

    让编程改变世界

    Change the world by program


     

    div指令

     

    div是除法指令(division),使用div作除法的时候:

    除数:8位或16位,在寄存器或内存单元中

    被除数:(默认)放在AX或DX和AX中

    除数 被除数 8位     16位(AX) 16位   32位(DX+AX) 结果:运算  8位   16位 商    AL    AX 余数   AH   DX  

    div指令格式:

    div  reg

    div  内存单元

    现在我们可以用多种方法来表示一个内存单元了。  

    div指令示例

    div byte ptr ds:[0] 含义为: (al) = (ax) / ((ds)*16+0) 商 (ah) = (ax) / ((ds)*16+0) 余数   div word ptr es:[0] 含义为: (ax) = [(dx)*10000H+(ax)]/((ds)*16+0) 商 (dx) = [(dx)*10000H+(ax)]/((ds)*16+0) 余数   div byte ptr [bx+si+8] (al)= (ax)/((ds)*16+(bx)+(si)+8) 商 (ah)=(ax)/((ds)*16+(bx)+(si)+8) 余数   div word ptr [bx+si+8] (ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 商 (dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 余数  

    编程实现1:利用除法指令计算100001/100。

    我们首先分析一下,被除数 100001 大于65535,不能用ax寄存器存放,所以我们要用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。 除数100小于255,可以在一个 8位寄存器中存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100。 因为要分别为dx和ax赋100001的高16位值和低16位值,所以应先将100001表示为十六进制形式:186A1H。 [codesyntax lang="asm"]
    mov dx,1
    mov ax,86A1H  ;(dx)*10000H+(ax)=100001
    mov bx,100
    div bx
    [/codesyntax] 程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)。 大家可自行在Debug中实践。  

    编程实现2:利用除法指令计算1001/100。

    我们首先分析一下被除数1001可用 ax寄存器存放,除数100可用 8位寄存器存放,也就是说,要进行8位的除法。 程序如下: [codesyntax lang="asm"]
    mov ax,1001
    mov bl,100
    div bl
    [/codesyntax] 程序执行后,(al)=0AH(即10),(ah)=1(余数为1)。

    伪指令dd

      前面我们用db和dw定义字节型数据和字型数据。 dd是用来定义dword (double word双字)型数据的。 示例: data segment

    db 1

    dw 1

    dd 1

    data ends  

    在data段中定义了三个数据:

    第一个数据为01H,在data:0处,占1个字节。

    第二个数据为0001H,在data:1处,占1个字。

    第三个数据为00000001H,在data:3处,占2个字节。

     

    问题8.1

      用div 计算data段中第一个数据除以第二个数据后的结果,商存放在第3个数据的存储单元中。 data segment

    dd 100001

    dw 100

    dw 0

    data ends 思考后看分析。 data段中的第一个数据是被除数,为dword(双字)型,32位,所以在做除法之前,用dx和ax存储。应将data:0字单元中的低16位存储在 ax中,data:2字单元中的高16位存储在dx中。  

    问题8.1程序实现代码

    [codesyntax lang="asm"]
        mov ax,data
        mov ds,ax
        mov ax,ds:[0]       ;ds:0字单元中的低16位存储在ax中
        mov dx,ds:[2]       ;ds:2字单元中的高16位存储在dx中
        div word ptr ds:[4] ;用dx:ax中的32位数据除以ds:4字
                            ;单元中的数据
        mov ds:[6],ax       ;将商存储在ds:6字单元中
    [/codesyntax]  

    dup

      dup是一个操作符,在汇编语言中同db、dw、dd 等一样,也是由编译器识别处理的符号。 它是和db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。  

    dup示例

    db 3 dup (0)  定义了3个字节,它们的值都是0,相当于 db 0,0,0   db 3 dup (0,1,2) 定义了9个字节,它们是0、1、2、0、1、2、0、1、2,相当于 db 0,1,2,0,1,2,0,1,2   db 3 dup (‘abc’,’ABC’) 定义了18个字节,它们是‘abcABCabcABCabcABC’,相当于db ‘abcABCabcABCabcABC’  

    可见,dup的使用格式如下:

    db 重复的次数 dup (重复的字节型数据)

    dw 重复的次数 dup (重复的字型数据)

    dd 重复的次数 dup (重复的双字数据)

      dup是一个十分有用的操作符 比如我们要定义一个容量为 200 个字节的栈段,如果不用dup,则必须用这样的格式: stack segment

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

    stack ends 当然,读者可以用dd,使程序变得简短一些,但是如果要求定义一个容量为1000字节或10000字节的呢?   如果没有dup,定义部分的程序就变得太长了 有了dup就可以轻松解决。如下: stack segment

    db  200  dup (0)

    stack ends [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LGMCFPCKREXN']视频下载[/Downlink]
  • 相关阅读:
    vue doubleclick 鼠标双击事件
    我是如何通过CSRF拿到Shell的
    js生成一个不重复的ID的函数的进化之路
    浅谈企业内部安全漏洞的运营(一):规范化
    如何让微信丢骰子永远只出“666”
    全能无线渗透测试工具,一个LAZY就搞定了
    关于8月31日维基解密被攻击的观察与分析
    VS2013 单元测试(使用VS2013自带的单元测试)
    解决WCF部署到IIS出现“证书必须具有能够进行密钥交换的私钥,该进程必须具有访问私钥的权限”
    VS2013 MVC Web项目使用内置的IISExpress支持局域网内部机器(手机、PC)访问、调试
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3847007.html
Copyright © 2020-2023  润新知