在学习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)将汇编代码编译成机器码的,为编译器提供信息,本身并不生成相应的机器码。