其他分享
首页 > 其他分享> > 3.2 段设定伪指令ASSUME、如何装入四个寄存器

3.2 段设定伪指令ASSUME、如何装入四个寄存器

作者:互联网

3.2 段设定伪指令ASSUME

作用

使用

格式

DATA1 SEGMENT
	VAR1 DB 12H
DATA1 ENDS
DATA2 SEGMENT
	VAR2DB 34H
DATA2 ENDS
CODE SEGMENT
	VAR3 DB56H
	ASSUME CS:CODE,DS:DATA1,ES:DATA2	;这里ASSUME来关联
START:
	.....
	INC VAR1	;该指令汇编时,VAR1使用的是DS
	INC VAR2	;该指令被汇编时,VAR2使用的是ES,即指令编码中有段前缀ES
	INC VAR3	;该指令汇编时,VAR3使用的是CS,即指令编码中有段前缀CS
	......
CODE ENDS
	END START

四个段寄存器的装入

1.DS和ES的装入

DATA1 SEGMENT
	DBYTE1 DB 12H
DATA1 ENDS
DATA2 SEGMENT
	DBYTE2 DB 14H DUP(?)
DATA2 ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA1	;关联。
START: 	MOV AX,DATA1	;数据段DATA1放到寄存器AX
        MOV DS,AX		;数据段从AX放到DS
        MOV AX,DATA2	;数据段DATA2放到寄存器AX,但是前面并未关联DATA2
        MOV ES,AX		;数据段从AX放到ES
        MOV AL,DBYTE1	;数据从DBYTE1放到AL
        MOV DBYTE2[2],AL	;该指令在汇编时出错,因为在ASSUME指令中未指定ES与DATA2关联
		……………
CODE ENDS

改正方法:

1、可以在变量DBYTE2前加一个段前缀说明即可。即:

MOV ES:DBYTE2[2],AL

2、,最好的办法是在ASUMME语句中,将ES与DATA2关联。

2.SS的装入:

有两种方法

STACK1 SEGMENT PARA STACK	;这里是使用了STACK参数
	DB 40H DUP(?)
STACK1 ENDS
	…………
CODE SEGMENT
	ASSUME CS:CODE,SS:STACK1 ;这里是寄存器与段关联了
	…………					;SS将被自动装入STACK1段的段基值,堆栈指针SP也将指向堆栈底部+2的存储单元。这里(SP)=40H。
DATA_STACK SEGMENT
	DB 40H DUP(?)
	TOP LABEL WORD ;TOP变量的偏移量为40H,即栈底+2,这里是WORD,因为SP是按字操作的
DATA_STACK ENDS
	......
CODE SEGMENT
	......
	MOV AX,DATA_STACK
	MOV SS,AX
	MOV SP,OFFSET TOP
	......
	

3.CS的装入:

如何装入

格式

END 起始地址(段定义结束用:ENDS)	;起始地址:可以是一个标号或表达式
CODE SEGMENT
	ASSUME CS:CODE.....
START: .....	;这里的起始地址就是标号START
CODE ENDS
	END START

装入CS和IP一般有下面两种情况。

1、由系统软件按照结束伪指令指定的地址装入初始的CS和IP,任何一个源程序都必须以END伪指令来结束。

2、在程序运行期间,当执行某些指令时,CPU自动修改CS和IP,使它们指向新的代码段,程序为非顺序执行中的某些类型〈不包括条件转移,循环等,它们是段内转移)。

例如:

标签:CODE,ASSUME,伪指令,装入,3.2,寄存器,CS,ES
来源: https://www.cnblogs.com/tupo/p/15698358.html