data segment
hz db 04h,80h,0eh,0A0h,78h,90h,08h,90h
code segment
main:
mov ax,data
mov ds,ax
mov
check_next_dot:
next_row:
mov ah,hz[si]
mov al,hz[si+1]
jnc no_dot;若没有进位,即cf=0,则跳到no_dot,cf(进位),刚移出的位会自动进入CF(进位标志)
code ends
-
0000:0000
-
F000:0000~F000:FFFF;ROM
-
A000:0000~A000:FFFF:显卡
-
B800:0000~B800:FFFF;显卡
-
C000:0000~C000:FFFF;ROM
-
程序可以使用的内存空间
- 0000:0000~9000:FFFF,640k大概有100k被dos使用
-
assume的作用
- assume不会对于ds,es进行赋值,只是会替换
- 常数段地址,段寄存器
- 在编译的时候替换
- 在程序刚开始运行时,ds=es=psp=程序的首段地址-10h,psp:program segment prefix,长度为100h字节
- psp中存放了一些命令行参数
- psp:80h开始存放命令行参数
- psp:80 命令行参数的长度,单位是字节
- psp:81-psp:ff为命令行参数的内容,空格也算是命令行参数的内容,回车没有算在命令行参数长度内,不计数但是会保存
- psp:16h 父程序的psp段地址
- cd 20一定是psp的前两个字节,对应int 20h(结束程序的运行)
-
当程序刚开始运行时,cs:ip,ss:sp会由操作系统自动对他们进行赋值,用户不需要手工复制,这4个寄存器的值保存在exe的文件头重,其中cs,ss保存的时相对值,sp和ip保存绝对值
- end main决定了程序开始的第一个条指令的地址,取main的偏移地址为0,即ip为0,这个ip就是main的偏移地址,ip(instruction potion),每个段的段地址都表示为该段段地址减去首段段地址之差
- cs的相对地址=code-首段地址即data
- sp=堆栈的长度
- ss的相对值=stk-首段地址即data
-
assume对同一个段与多个段寄存器有关联
- ds>ss>es>cs
日本語の
-
堆栈
-
;code和data段可以定义多个 stk segment stack;堆栈只能定义一个 db 200h dup('S');200h的数组,每个元素内容均为S,无名数组,sp=200h stk ends
-
只允许push 16,32位
-
data1 segment
data1 ends
data2 segment
data2 ends
code segment
assume cs:code,ds:data1
FL标志寄存器
FL共16位,但只用其中9位,6个状态标志和3个控制标志
11 10 9 8 7 6 4 2 0
CF:进位标志(carry flag)
mov ah,0ffh
add ah,1;ah=0,cf=1产生了进位,最高位产生了进位
减法产生了借位,cf也变成了1
左移和右移也会产生一个进位
左移和右移丢失的位会保存到cf中
jc 有进位 jmp
jnc没有进位
adc add with carry
clc ;使cf=0
stc;使cf=1
cmc;使cf反转
jb等效于jc
mov ax,1
mov bx,2
sub ax,bx;
jb next| jc next;两个等效,都是根据cf进行跳转
adc ah,0 ;ah=ah+0+cf
data segment
abc db 7fh
s db 8 dup(0),0Dh,0Ah,'$'
data ends
code segment
main:
mov ax,data
mov ds,ax
next:
shl al,1;左移一位
mov dl,'0'
adc dl,0;dl=dl+0+cf,判断0和1的好方法
mov指令不影响任何标志位
跟计算的指令会影响标志位,而mov指令不影响标志位
-
ZF
-
零标志(zero flag)
-
sub ax,ax;AX=0,zf=1,zero is true add ax,1;ax=1,zf=0 ;如果换成了mov ax,1;ax=1,zf=1 jz|je;je,jz都是根据zf=1进行跳转 jnz|jne mov ax,123 mov bx,123 cmp ax,bx;zf=1
-
-
SF
-
符号标志(sign flag)
-
mov ah,7fh add ah,1;ah=80h,sf=1(运算结果的最高位,即符号位),为1表示负数,0为证书 sub ah,1;ah=7fh,sf=0 jns;sf==0跳 js;sf==1跳
-
-
OF
-
溢出标志(overflow flag)
-
mov ah,7fh add ah,1;ah=80h,of=1,正数加正数为负数,一处 mov ah,80h add ah,0FFh;ah=7fh,of=1负数加负数为正数,溢出 ;正负运算不会溢出 jo;of==1 jno;of==0
-