EVEN,ALIGN,ORG,dup指令的理解

因为在汇编机器语言中存在 ds  ds是连续的数据段 直接使用ds写入 过程麻烦

masm使用伪指令 来定义数据类型 并且自动写入ds段

安装 winmasm v2.2 调试如下例子 学习4个指令的区别

data segment
    a1 db 12H
      ;这里表示下一个数据的存放位置为 偶数位的地址 如果下一位
      ;是奇数则空出来一位 找到偶数为 才存数据  比如这里 a1 占用0000
      ;本来 a2应该占用0001偏移的 因为不是偶数地址所以 0001是空 0002位偶数所以0002上才上了34H
    EVEN 
    a2 db 34H
      ;ALIGN  Num
      ;其中:Num必须是2的幂,如:2、4、8和16等。
      ;伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。
      ;ALIGN 8 前面的a2变量已经占用了0002 那么下一个地址能被8整除的就是0008
      ;了 所有a3存放在0008上
    ALIGN 8
    a3 db 5AH
      ;这里org是直接指定哪个偏移地址上写入数据
      ;比如上面 a3写入在0008上 那么这里我指定 写入到000B上
      ;ORG 000BH
    ORG 000BH
    a4 db 6BH
      ;这里定义复合内存变量
      ;a5 dw 2 dup(?)
      ;表示定义循环2次 这里a4到达了000BH 
      ;dw占用两个字节 循环两次就是四个自己 a4占用到 000FH
    a5 dw 2 dup(?)
;表示定义循环2次 这里a5到达了000FH a6从0010H开始
;中间 'ABCD',? 相对于db是占用5个byte 循环两次占用10个byte
;00cch占用一个byte a6占用到0010H+11=001A (这里从0010H所以只到001A)
    a6 db 2 dup('ABCD',?),0CCH
    ;这里定义个复合数据类型 这个是在编译时用到的所以不占用任何内存 只有实例化才会占用内存
    datype UNION 
names DB 'a'
    datype ends
    bs datype <'j'>
data ends


stack segment
        ;input stack segment code here
stack ends


code segment
    assume cs:code,ds:data,ss:stack
start:
    mov ax,data
    mov ds,ax
    mov bx,offset bs 
    mov si,bx
    mov [si],'a'
        ;input code segment code here
    mov ah,4ch
    int 21h
code ends
end start


这里 以上代码 经过编译最终会生成机器码

 data段的首地址应该是动态
编译之后假设data的首地址为2B0B

编译下面这一段

    a1 db 12H
    EVEN 
    a2 db 34H
    ALIGN 8
    a3 db 5AH

机器码结果就为
mov ax,2B0BH
mov ds,ax
mov si,0000H
mov [si],12H
mov [si+2],34H
mov [si+8],5AH


posted @ 2015-04-16 19:36  饺子吃遍天  阅读(456)  评论(0)    收藏  举报