MASM汇编中伪指令ASSUME的作用

美洲象的技术博客 / 2023-08-30 / 原文

  在学习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)的方式