语法——字符串的输出
data segment
str db 'hello li$'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov dx,offset str ;获得对应数据的偏移地址
mov ah ,9H ;9H表示调用显存,从dx读取偏移地址对应的数据、
int 21H
;退出程序
mov ah, 4ch
int 21h
code ends
end start
段寄存器
-
如何区分指令和数据 -- 借助段寄存器标记
-
段寄存器的种类
DS---->data segment ;数据 SS---->stack segment CS---->code segement ;指令 ES---->extra segement
-
段寄存器的本质是存放段地址的
段地址是物理地址的一部分
内存中的每一个实际的数据都有其物理地址
实际的物理地址通过5位十六进制表示
实际物理地址 = 段地址 * 16 ; 偏移地址 71001 = 0710 * 16 : 0001
-
DS寄存器用于存放数据的段地址,数据对应的偏移地址用bx寄存器存放
-
CS寄存器用于存放指令所在的段地址,IP寄存器存放当前正在执行的指令所对应的偏移地址
-
所有使用CS:IP进行操作的内存数据都被当做指令,读取时将十六斤进制的数据转成对应的指令并执行
-
-
SS寄存器用于存放栈空间对应的段地址
-
所有被SS操作的内存空间被当成栈空间进行对待
-
栈的数据存放方式不同
-
SP寄存器存放栈空间偏移量,SS和SP配合使用
-
-
ES寄存器用于DS的替补。DS被占用而无法使用时,临时用ES代替,用法和DS一样
栈空间的操作
-
栈是一种特殊的存储结构。
-
正常的数据排列方式是数据从低地址向高地址进行偏移存放,读取也是这样
-
而栈是写入数据时,从高到低进行偏移;读取时是从低到高进行读取
-
因此,在定义一块空间作为栈空间使用时,都会先往高地址偏移一段空间
-
栈存储特点:
-
一次读写两个字节的数据
-
数据高地址往低地址逆序偏移存放
-
栈空间的声明 -- 开辟一块未标记内存空间,用ss标记为栈空间
-
向栈空间内写入数据 -- 使用push指令
-
从栈空间中读取数据 -- 使用pop指令
data segment db 0,0,0,0,0,0,0,0 ;定义数据,相当于开辟一块未标记内存空间 data ends code segment start: mov ax, data mov ss, ax ;用ss将这块空间标记为栈空间 mov sp, 8 mov ax, 2000H push ax ;使用push指令,向栈空间内写入数据,一次写入两个字节的数据,如果使用al会编译报错 pop bx ;使用pop指令,从栈空间内读取数据,一次读取两个字节的数据,如果使用bl会编译报错 code ends end start
-
-
栈空间和数据段空间中,存放的都是数据
-
可以使用ss来存放数据段的段地址,读写操作和DS一样,例如SS:[N];如果充当栈段时,读写操作是pop和push
-
由于pop和push默认以SS寄存器中的数据作为栈段地址,故不能使用其他段寄存器充当栈段寄存器
-