汇编
-
AX称为累加器(Accumulator) 使用频度最高。用于算术、逻辑运算以及与外设传送信息等
-
BX称为基址寄存器(Base address Register) 常用做存放存储器地址
-
CX称为计数器(Counter) 作为循环和串操作等指令中的隐含计数器
-
DX称为数据寄存器(Data register) 常用来存放双字长数据的高16位,或存放外设端口地址
-
变址寄存器SI和DI 常用于存储器变址寻址方式时提供地址 SI是源地址寄存器(Source Index) DI是目的地址寄存器(Destination Index) 在串操作类指令中,SI、DI还有较特殊的用法
-
SP为堆栈指针寄存器(Stack Pointer),指示堆栈段栈顶的位置(偏移地址) BP为基址指针寄存器(Base Pointer),表示数据在堆栈段中的基地址(栈底)
-
标志(Flag)用于反映指令执行结果或控制指令执行形式 8088处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)
-
IP(Instruction Pointer)为指令指针寄存器,指示主存储器指令的位置 随着指令的执行,IP将自动修改以指示下一条指令所在的存储器位置 IP寄存器是一个专用寄存器 IP寄存器与CS段寄存器联合使用以确定下一条指令的存储单元地址
常用指令
一些小知识点
-
指令的助记符格式(对应一个二进制编码)
操作码 操作数1,操作数2 ;注释
其中:
操作数1为目的操作数(src),操作室2位源操作数(dest),
由目的操作数保存操作后的结果
-
变量定义:
汇编语言格式:变量名 变量定义伪指令 初值表
例:bvar byte 0,128,255,-128,0,+127
-
初始化数据:
?
代表初值不确定如果多个存储单元的初值相同,可以用赋值操作符DUP说明
助记符:
重复次数 DUP(重复参数)
常见模式:
BUF1 DB 01,52H
BUF2 DW 3 DUP(?,0)
BUF3 DB 2 DUP(0,2DUP(1,2),3)
第一个:BUF1有两个值为1,52H
第二个:BUF2有3次重复数,每次重复为
不确定,0
第三个:BUF3有2次重复的
0, 2次重复的1,2, 3
-
小端模式:低对低,高对高(单字内)
存储单元 存储器地址 38H 35H 32H 34H 31H 33H 39H 32H 即存储两个字,3139H和3832H
-
段超越(改变默认段寻址)
-
通常内址寻址是数据段或者堆栈段,但你可以在指令前面加上段超越前缀,就可以访问到其它段内的数据
-
常见段寄存器
-
CS:代码段,与IP结合使用
-
SS:堆栈段寄存器,一般与SP和BP结合使用
-
ES:附加段,存放数据,专为处理数据串设计的串操作指令必须使用附加段作为其目的操作数的存放区域
-
DS:数据段,用于存放数据
-
-
助记符:
段寄存器:
例:MOV ECX,DS:[40500H]
-
段寄存器使用规定
访问存储器方式 约定段 段寄存器 前缀段 段寄存器 偏移 取指令 CS 无 IP 堆栈操作 SS 无 SP 一般数据存取 DS CS/ES/SS 有效地址 源数据串 DS CS/ES/SS SI 目的数据串 ES 无 DI BP寄存器 SS CS/ES/SS 有效地址 -
SI,DI寄存器
-
-
-
栈
-
EQU与等号的区别:
A.使用EQU伪指令定义的符号名不能与其它符号名重名,符号名必须唯一,且不能被重新定义;而使用等号伪指令"="定义的符号名可以重名,可以被重新定义,可被重新赋值;
B.使用EQU伪指令定义的符号名不仅可以代表某个常数或常数表达式,还可以代表字符串、关键字、指令码、一串符号(如:WORD PTR),等等;而使用等号伪指令"="定义的符号名仅仅用于代表数值表达式;
C.使用等价伪指令EQU定义的符号名和使用等号伪指令定义的符号名都不会被系统分配存储空间;
标志位
一、运算结果标志位 1、进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag) 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时; (2)、在字节操作时,发生低4位向高4位进位或借位时。
4、零标志ZF(Zero Flag) 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
指令及其对标志位影响
传送指令MOV
MOV reg/mem,imm
MOV reg/mem/seg,reg
MOV reg/seg,mem
MOV reg/mem,seg ;段寄存器送寄存器或主存
注意 :常见错误
-
源操作数和目的操作数的类型一致
-
无法确定是字节量还是字量操作(使用存储器寻址时)
-
两个操作数都是存储器
-
段寄存器的操作有一些限制
如:MOV DS, ES ;非法指令,修正: ;mov ax,es ;mov ds,ax MOV DS, 100H ;非法指令,修正: ;mov ax,100h ;mov ds,ax MOV CS, [SI] ;非法指令 ;CS不和IP能做目的操作数
交换指令XCHG
交换dest和src中的数据
XCHG reg,reg/mem
XCHG mem,reg
不能在存储器和存储器之间对换数据
换码指令XLAT
将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL
XLAT ;al←ds:[bx+al]
进栈指令PUSH
进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部
PUSH r16/m16/seg
;SP←SP-2
;SS:[SP]←r16/m16/seg
出栈指令pop
出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2
POP r16/m16/seg
; r16/m16/seg←SS:[SP]
;SP←SP+2
标志操作指令
CLC ;复位进位标志:CF←0 STC ;置位进位标志:CF←1 CMC ;求反进位标志:CF←~CF CLD ;复位方向标志:DF←0 STD ;置位方向标志:DF←1 CLI ;复位中断标志:IF←0 STI ;置位中断标志:IF←1
有效地址传送指令LEA
将存储器操作数的有效地址送至指定的16位通用寄存器
LEA r16, mem
;r16←mem的有效地址EA
ADD 和SUB(全影响)
ADD dest,src
;加法:dest←dest+src
;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数
SUB dest,src
;减法:dest←dest-src
;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数
带进位加和减(全影响)
ADC dest,src
;加法:dest←dest+src+CF
;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数
SBB dest,src
;减法:dest←dest-src-CF
;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数
增量和减量(仅不影响CF)
INC reg/mem
;增量(加1):reg/mem←reg/mem+1
DEC reg/mem
;减量(减1):reg/mem←reg/mem-1
INC指令和DEC指令是单操作数指令
与加法和减法指令实现的加1和减1不同的是:INC和DEC不影响CF标志
求补指令NEG(与sub相同全影响)
NEG reg/mem
;reg/mem←0-reg/mem
符号扩展指令(不影响标志位)
零扩展:
MOVZX r16,r8/m8
MOVZX r32,r8/m8/r16/m16
符号扩展:
MOVSX r16,r8/m8
MOVSX r32,r8/m8/r16/m16
比较指令(全影响)
比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系
CMP dest,src
;做减法运算:dest-src
;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数
乘除法指令(详见下)
乘法指令分无符号和有符号乘法指令
MUL reg/mem ;无符号乘法,高位保存在dx,低位保存在ax
IMUL reg/mem ;有符号乘法
除法指令分无符号和有符号除法指令
DIV reg/mem ;无符号除法
IDIV reg/mem ;有符号除法
乘法:若乘积的高一半是低一半的符号位扩展,说明高一半不含有效数值,则OF=CF=0,若高一半有效,则OF=CF=1,乘法对其他状态标志没有定义(不可预测)
除法:除法指令使状态标志没有定义,但是当除数为0或者商超过了所能表达的范围,会发生除法溢出。
被乘数 | 乘数(指令指出) | 乘积 |
---|---|---|
AL | reg/mem8 | AX |
AX | reg/mem16 | DX:AX |
EAX | reg/mem32 | EDX:EAX |
DIV:
被除数 | 除数(指令指出) | 商 | 余数 |
---|---|---|---|
AX | reg/mem8 | AL | AH |
DX:AX | reg/mem16 | AX | DX |
EDX:EAX | reg/mem32 | EAX | EDX |
逻辑运算指令(异或,TEST)
双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义;它们的操作数组合与ADD、SUB等一样:
运算指令助记符 reg, imm/reg/mem
运算指令助记符 mem, imm/reg
单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:
NOT reg/mem
左/右移位指令(只影响CF,SF,ZF,PF)
-
逻辑移位
左:
SHL reg/mem,1/CL
;reg/mem左移1或CL位
;最低位补0,最高位进入CF
右:
SHR reg/mem,1/CL
;reg/mem右移1/CL位
;最高位补0,最低位进入CF -
算术移位
左:
SAL reg/mem,1/CL
;与SHL是同一条指令
右:
SAR reg/mem,1/CL
;reg/mem右移1/CL位
;最高位不变,最低位进入CF
循环移位指令(不影响SF、ZF、PF、AF标志,影响CF)
循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:
ROL reg/mem,1/CL ;不带进位循环左移
ROR reg/mem,1/CL ;不带进位循环右移
RCL reg/mem,1/CL ;带进位循环左移
RCR reg/mem,1/CL ;带进位循环右移
循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志
判断CF,最高有效为向更高位有进位
加法指令 ADD (addition)
指令对标志位的影响:
CF=1 最高有效位向高位有进位
CF=0 最高有效位向高位无进位
OF=1 两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反。
OF=0 两个不同符号数相加,或同符号数相加,结果符号与其相同。
带进位加法指令 ADC (add with carry)带进位加
指令对标志位的影响:
CF=1 最高有效位向高位有进位
CF=0 最低有效位相高位无进位
OF=1 两个同符号数相加,结果符号与其相反,
OF=0 两个同符号数相加,或同符号相加,结果符号与其相同
加1指令 INC (increament)
指令对标志位的影响:
对CF无影响
OF=1 两个同符号数相加,结果符号与其相反,
OF=0 两个同符号数相加,或同符号相加,结果符号与其相同。
减法指令 SUB (subtract)
指令对标志位的影响:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
带借位减法指令 SBB (subtract with borrow)
指令对标志位的影响:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
减1指令 DEC (decrement)
指令对标志位的影响:
对CF无影响
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
比较指令 CMP (compare)
指令对标志位的影响:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
求补指令 NEG (negate)
指令对标志位的影响:
CF=1 不为0的操作数求补时
CF=0 为0的操作数求补时
OF=1 操作数为-128(字节运算)或操作数为-32768(字运算)
OF=0 当求补运算的操作数不为-128(字节)或-32768(字)时
无符号乘法指令 MUL (unsigned multiple) 有符号乘法指令 IMUL(signed muliple)
指令对标志位的影响:乘法指令只影响标志位CF和OF,其他条件码位无定义。
MUL指令的条件码设置为:
CF OF=0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))
CF OF=1 1 乘积的高一半不为0
IMUL指令的条件码设置为:
CF OF=0 0 乘积的高一半为低一半的符号扩展.
CF OF=1 1 其他情况
无符号数除法 DIV (unsigned divide) 带符号数除法 IDIV (singed divide)
指令对标志位的影响:不影响条件码。
逻辑与 AND (logic and)
指令对标志位的影响:
指令执行后 CF 和 OF 置零,AF无定义。
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
逻辑或 OR (logic or)
指令对标志位的影响:
令执行后 CF 和 OF 置零,AF无定义。
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
逻辑非 NOT (logic not)
指令对标志位的影响:对标志位无影响
异或 XOR (exclusice or)
指令对标志位的影响:
令执行后 CF 和 OF 置零,AF无定义。
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
测试指令 TEST 与异或相同
指令对标志位的影响:
令执行后 CF 和 OF 置零,AF无定义。
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
逻辑左移 SHL (shift logical left)
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
逻辑右移 SHR (shift logical right)
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
算术左移 SAL (shift arithmetic left)
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
算术右移 SAR (shift arithmetic right)
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
循环左移 ROL (rotate left)
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
循环右移 ROR (rotate right)
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
带进位的循环左移 RCL (rotate left through carry)
指令对标志位的影响:CF=移入的数值。
OF=1 当cnt=1时,移动后最高位的值未发生变化。
OF=0 当cnt=1时,移动后最高位的值发生变化。
SF、ZF、PF标志位不受影响。
带进位的循环右移 RCR (rotate right through carry)
指令对标志位的影响:CF=移入的数值。
OF=1 当cnt=1时,操作数最高位的值未发生变化。
OF=0 当cnt=1时,操作数最高位的值发生变化。
SF、ZF、PF标志位不受影响。
串传送 MOVSB / MOVSW (move string byte/word)
指令对条件码的影响:不影响条件码。
存串 STOSB / STOSW (stroe from string byte/word)
指令对条件码的影响:不影响条件码。
取串LODSB / LODSW (load from string byte/word)
指令对条件码的影响:不影响条件码。
串比较 CMPSB / CMPSW (compare string byte/word)
指令对条件码的影响:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
串扫描 SCASB / SCASW (scan string byte / word)
指令对条件码的影响:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
条件转移指令
指令的汇编格式及功能 根据条件码的值转移:
49、JZ(JE) OPR ZF=1
50、JNZ(JNE) OPR ZF=0
51、JS OPR SF=1
52、JNS OPR SF=0
53、JO OPR OF=1
54、JNO OPR OF=0
55、JP OPR PF=1
56、JNP OPR PF=0
57、JC OPR CF=1
58、JNC OPR CF=0
比较两个无符号数,根据比较的结果转移
59、JB(JNAE,JC) OPR CF=1 被减数小于减数则转移
60、JNB(JAE,JNC) OPR CF=0 被减数大于或等于减数则转移
61、JBE(JNA) OPR CF或ZF=1 被减数小于或等于减数则转移
62、JNBE(JA) OPR CF或ZF=0 被减数大于减数则转移
比较两个带符号数,根据比较结果转移
63、JL/JNGE OPR SF异或OF=1 被减数小于减数则转移
64、JNL/JGE SF异或OF=0 被减数不小于减数则转移
65、JLE/JNE (SF异或OF)与ZF=1 被减数不大于减数则转移
66、JNLE/JG (SF异或OF)与ZF=0 被减数大于减数则转移
根据CX寄存器的值转移
67、JCXZ (CX)=0 CX内容为零 则转移
伪操作指令
-
定位伪指令用于控制存放的位置
助记符:
org 100h
;跳过100H个空间
跳转指令
A:above 大于
B:below 小于
E:equal 等于
不带符号数大小的判定:A-B,只看CF和ZF 当CF=1时,A<B;可用指令:JC,JB,JNAE 当ZF=1时,A=B;可用指令:JZ,JE 当CF=ZF=0时,A>B。可用指令:JA,JNBE
G: great 大于
L:less 小于
E:equal 等于
带符号数大小的判定:A-B,须看OF、SF和ZF 当(SF⊕ OF)=1时,A<B;可用指令:JL,JNGE 当ZF=1时,A=B;可用指令:JZ,JE 当(SF⊕ OF)=0,并且ZF=0时,A>B。可用指令:JG,JNLE
注解:跳转的时候会调到对应代码位置,代码位置后加:
,在汇编后会修改成对应指令的地址
串检传送指令
-
串传送指令:将数据段中的字节/字/双字传送至ES指向的段
MOVSB ;字节8位 ES:[EDI]=DS:[ESI],然后ESI=ESI+/-1,EDI=EDI+/-1
MOVSW ;字16位 ES:[EDI]=DS:[ESI],然后ESI=ESI+/-2,EDI=EDI+/-2
MOVSD ;双子32位 ES:[EDI]=DS:[ESI],然后ESI=ESI+/-4,EDI=EDI+/-4 -
串传送指令:将AL/AX/EAX内容存入ES指向的段
STOSB ;字节串存储:ES:[EDI]=AL;然后edi=edi+1
STOSW ;字串存储:ES:[EDI]=AX;然后edi=edi+2
STOSD ;双字串存储:ES:[EDI]=EAX;然后edi=edi+4 -
串读取指令:将数据段中的字节/字/双字数据读取到AL/AX/EAX中
LODSB ;字节串读取:AL=DS:[ESI];然后:ESI=ESI+/-1
LODSW ;字串读取:AL=DS:[ESI];然后:ESI=ESI+/-2
LODSD ;双字串读取:AL=DS:[ESI];然后:ESI=ESI+/-4 -
重复前缀指令:用在上3中指令前,利用ecx存储数据串长度
REP ;每执行一次串指令,ECX减1;直到ECX=0,重复执行结束
注意:串操作指令本身仅进行一个数据的操作,利用重复前缀指令才能实现连续操作。
REP MOVSB
DAA指令
十进制数加调整指令DAA(Decimal Adjust After Addition)
该指令是用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。
压缩型BCD码是一个字节存放二个BCD码,低四位和高四位都是一个BCD码。
其调整规则如下:
1、如果AL的低四位大于9,或标志位AF=1,那么,AL=AL+6,并置AF=1;
2、如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;
3、如果以上两点都不成立,则,清除标志位AF和CF。
经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相加,并进行调整后,得到的结果还是压缩型BCD码。
寻址方式
-
立即数寻址(操作数直接存放在机器代码中)
助记符:
mov ax,0102H
-
寄存器寻址(操作数存放在寄存器中)
助记符:
mov ax,bx
默认的段地址在DS段寄存器,可使用段超越前缀改变
-
存储器寻址方式
-
直接寻址(地址在指令中直接给出)
助记符:
MOV AX ,[2000H]
MOV AX,ES:[2000H]
-
寄存器间接寻址(有效地址存放在基址寄存器BX或变址寄存器SI、DI中)
助记符:
MOV AX,[BX]
默认的段地址在DS段寄存器,可使用段超越前缀改变
-
寄存器相对寻址(有效地址为寄存器内容与偏移量之和,寄存器可以是BX、BP或SI、DI)
助记符:
MOV AX,[SI+06H]
MOV AX,06H[SI]
默认的段地址在DS段寄存器,可使用段超越前缀改变
-
基址变址寻址
有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 有效地址=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
助记符:
MOV AX,[BX+SI]
MOV AX,[BX][SI]
-
相对基址变址寻址方式
有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 有效地址=BX/BP+SI/DI+8/16位位移量 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
助记符:
MOV AX,[BX+DI+6]
MOV AX,6[BX+DI]
-
常用地址操作符和类型操作符
一、地址操作符
-
[]
:将包括起来的表达式作为存储器地址指针 -
$
:返回当前偏移地址 -
OFFSET 变量名
:返回变量名所在的段偏移地址(偏移量) -
SEG 变量名
:返回段基地址(实地址存储模型)
二、类型操作符
-
类型名 PTR 变量名
:将变量按照指定的类型使用 -
TYPE 变量名
:返回一个字量数值,表明变量的类型 -
LENGTHOF 变量名
:返回整个变量的数据项数(即元素数) -
SIEZOF 变量名
:返回整个变量占用的字节数
实验
-
循环控制变量一般存放在cx中
LOOP XXXX ;cx=cx-1,跳转到xxx处
-
栈操作
-
屏幕显示字符和字符串
-
字符
dos功能调用:
MOV AH,02H
代码
DATAS SEGMENT
;此处输入数据段代码
TEN DB 1H
ONE DB 'I AM HAPPY$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
XOR DX,DX;
ADD TEN,30H
MOV DL,TEN
MOV AH,2H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START -
字符串
dos功能调用:
MOV AH,09H
此时将dx指向地址的数据输出,遇到$符号截止
DATAS SEGMENT
;此处输入数据段代码
TEN DB 1H
ONE DB 'I AM HAPPY$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
XOR DX,DX;
lea Dx,ONE ;dx存地址,所以使用16位dx
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START -
延时功能
mov cx,25 ;延时
l: push cx
mov cx,0
loop $
pop cx
loop l
-