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

浙公网安备 33010602011771号