MASM汇编中伪指令ASSUME的作用
在学习16位MASM宏汇编时,开始犯的一个错误就是认为assume就是给CS、SS、DS等段寄存器进行初始化赋值的。但又需要在源码的开始阶段,通过mov ax,datasg和mov ds,ax对DS进行手动赋值,assume ds:datasg不是已经赋值过了么,倍感疑惑!
比如下面代码:
assume cs:codesg,ss:stacksg,ds:datasg1,es:datasg2
;-------------------------------------------
stacksg segment stack
db 100 dup (0)
stacksg ends
;-------------------------------------------
datasg1 segment
tmsg db "hello,world!",13,10,'$'
datasg1 ends
;-------------------------------------------
datasg2 segment
tnum dw 9
datasg2 ends
;-------------------------------------------
codesg segment
start:
mov ax,datasg1
mov ds,ax
mov ax,datasg2
mov es,ax
mov ax,tnum
mov ax,4c00h
int 21h
codesg ends
end start
一、伪指令的概念
伪指令就是编译器(masm)将汇编代码编译成机器码的,为编译器提供信息,本身并不生成相应的机器码。
二、寻址的概念
就是cpu去哪里获取数据或指令,换句话就是说每一个含有操作数的汇编指令,这些操作数如果含有标号(示例中:start:)、变量名(示例中:tnum)等,这些符号都代表着什么。
1、这些符号都代表的是地址,即去这些地址获取数据。示例中的mov ax,tnum就会编译成mov ax,[0000],去偏移地址0000处获取数据。
2、16位的程序是通过段地址(segment address):偏移地址(offset address)的方式