zoukankan      html  css  js  c++  java
  • 汇编入门学习笔记 (七)—— dp,div,dup

    疯狂的暑假学习之  汇编入门学习笔记 (七)——  dp。div。dup


    參考: 《汇编语言》 王爽 第8章


    1. bx、si、di、和 bp


    8086CPU仅仅有4个寄存器能够用 “[...]” 中进行单元寻址。


    bp:除了默认的段地址是ss。其它与bx一样。


    它们全部正确的组合

    mov ax,[bx]
    mov ax,[si]
    mov ax,[di]
    mov ax,[dp]
    mov ax,[bx+si]
    mov ax,[bx+di]
    mov ax,[bp+si]
    mov ax,[bp+di]
    mov ax,[bx+si+idata]
    mov ax,[bx+di+idata]
    mov ax,[bp+si+idata]
    mov ax,[bp+di+idata]

    注意:bx与bp不能够同一时候使用,如[bx+bp]是错误的


    2. 指明要处理的数据长度


    word ptr 表示字

    byte ptr 表示字节


    像这样,寄存器就直接指定了数据的长度:


    mov ax,1
    mov ax,ds:[0]

    可是,看以下的样例:

    assume cs:code,ds:data
    
    data segment
    	dw 1111H,1111H,1111H,1111H,1111H,1111H,1111H,1111H
    data ends 
    
    code segment
    	start:	mov ax,data
    		mov ds,ax
    		mov ds:[0],1  ;Error
    			
    		mov ax,4c00H
    		int 21H
    code ends
    
    end start
    

    这样编译会报错,由于编译器不知道1是8位还是16位。


    改进:

    assume cs:code,ds:data
    
    data segment
    	dw 1111H,1111H,1111H,1111H,1111H,1111H,1111H,1111H
    data ends 
    
    code segment
    	start:	mov ax,data
    		mov ds,ax
    		mov byte ptr ds:[0],1  ;Error
    			
    		mov ax,4c00H
    		int 21H
    code ends
    
    end start
    

    加上byte ptr 或者 word ptr才对。

    加上byte ptr时,执行后,ds段中的值为: 0B56:0000  01 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11

    加上word ptr时,执行后,ds段中的值为:0B56:0000  01 00 11 11 11 11 11 11-11 11 11 11 11 11 11 11


    样例:

    assume cs:code,ds:data
    
    data segment
    	dw 00FFH
    data ends 
    
    code segment
    	start:	mov ax,data
    		mov ds,ax
    		inc byte ptr ds:[0]
    			
    		mov ax,4c00H
    		int 21H
    code ends
    
    end start
    

    inc byte ptr ds:[0] 后,ds:[0] ds:[1] 为 00 00


    假设改为inc word ptr ds:[0],执行后 ds:[0] ds:[1] 位 00 01



    3. 伪指令dd,div指令



    伪指令dd 表示32位,dw表示16位,db表示8位。样例见以下。


    div 是除法指令。格式:div 除数


    除数有两种,假设是8位的,被除数就是16位的,且存放在ax中。运算结果:商存放在 al 中,余数存放在 ah 中

    假设除数是16位的,被除数就是32位的,且低16位放在 ax 中。高16位就存放在 dx 中。

    运算结果:商存放在 ax 中,余数存放在 dx 中


    被除数就是32位的样例:

    assume cs:code,ds:data
    
    data segment
    	dd 100001
    	dw 100
    	dw 0
    data ends
    
    code segment
    	start:	mov ax,data
    		mov ds,ax
    		mov ax,ds:[0]
    		mov dx,ds:[2]
    		div word ptr ds:[4]
    		mov ds:[6],ax
    			
    		mov ax,4c00H
    		int 21H
    code ends
    
    end start

    执行后ax为03E8H ,dx 为0001H


    4. dup


    dup 要与dd。dw,db配合使用,用来反复定义数据


    样例:


    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’ 



  • 相关阅读:
    1012 The Best Rank (25 分)(排序)
    1011. World Cup Betting (20)(查找元素)
    1009 Product of Polynomials (25 分)(模拟)
    1008 Elevator (20 分)(数学问题)
    1006 Sign In and Sign Out (25 分)(查找元素)
    1005 Spell It Right (20 分)(字符串处理)
    Kafka Connect 出现ERROR Failed to flush WorkerSourceTask{id=local-file-source-0}, timed out while wait
    flume、kafka、avro组成的消息系统
    Java23种设计模式总结【转载】
    Java编程 思维导图
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5356980.html
Copyright © 2011-2022 走看看