通常用于存放一般性的数据;
CPU从何处执行是由寄存器决定的, 设CS的value = M, IP的value = N , CPU将从M*16 + N 内存单元开始执行;(因为CPU的地址加法器采用 物理地址 = 段地址*16 + 偏移地址 来表示物理地址)
Attention: jmp 可以修改CS和IP的值;
通常用来存放要访问数据的段地址;
mov bx,1000h
mov ds,bx
mov al,[0]
将1000:0 内存单元中的 数据copy到 al
bx用于存放偏移地址EA (effective addr), 段基址在ds中的内存单元;
如mov [bx] ,ax
将ax中的内容copy到 ds:bx (ds*16+bx)内存单元中。
对于mob bl,[1] ; mov cl,[2] ; debug将[1] 解释为一个内存单元 即将[idata]解释为[idata]内存单元的偏移地址,段基地址在ds中,而编译器将[1]解释为1, 即将[idata]解释为idata立即数了;
mov ax, [bp + di ]
bx+si ;
bx+di ;
bp+si ;
bp + di;
mov ax,[bp+si+idata] (基址变址相对寻址)
mov ax,[bx+si+8] 段地址默认在ds中;
mov ax,[bp+si + 8] 段地址默认在ss中;
当然你也可以显性指定,如
mov ax,es:[bx]
mov word ptr ds:[0],1 ; word ptr指明了访问的内存单元是一个字单元
mov byteptr ds:[0],1 ; byte ptr指明了访问的内存单元是一字节字单元
任意时刻, SS:SP指向栈顶元素。push和pop指令时,CPU从ss和sp中得到栈顶元素;
pushf和popf的功能是向标志寄存器的压栈和从标志寄存器出栈;
什么是标志寄存器, 其中存储的信息就是程序状态字PSW(program status word)
cf==carry flag (进位标志) 前一条指令执行结果产生的进位
pf==parity flag (奇偶标志位)前一条指令执行结果 1 的个数是否为偶数,偶数为1,否则为0;
af==
zf==zero flag(零标志位) 前一条指令执行结果是否为0,为0则zf=1, 否则为0;
sf=sign flag (符号标志) 如果为负, sf=1,否则为0;
tf
if
df
of==overflow flag 溢出标志
movsb, 功能执行movsb指令相当于进行以下几步:
movsw ,根据标志寄存器df位的值,将si和di +2 或 -2
mov ax,data
mov ds,ax
mov si,0 ; ds:si 指向data:0
mov es,ax
mov di,16 ; es:di 指向data:0010
mov cx,16 ; cx=16 ,rep循环16次
cld ;设置df=0,
rep mobsb
cld: 将标志寄存器的df位置0
std: 将标志寄存器的df位置1
取偏移地址
assume cs:codesg
codesg segment
start: mov ax, offset start ; 相当于mov ax,0
s:mov ax, offset s ;相当于mov ax,3
上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX
涉及的标志位:DF、AF、CF、OF、PF、SF、ZF