跟大家一起复习汇编语言之一(实模式)【原创】
前沿:今年的前些时候,在杂志的一篇文章看到如下一句:“掌握汇编,仍是高手必经之路”。然而在实际的学习中,汇编往往因为其应用太难而被初学者忽视。熟悉汇编语言,将是自己在软件调试时的“倚天剑”,重要性实不言而喻。也有很多在学习的过程中几次三番,最终退却。希望这一篇文章可以与你一起,重拾汇编这把双刃剑。文档转载请注明“天衣有缝”原创。
0.本文讲述汇编语言的基础知识,寻址方式,指令系统,宏汇编,结构化程序设计,堆栈,函数,中断等知识
1.汇编简介:
汇编语言是一种符号语言,比机器语言容易理解和掌握,也容易调试和维护。但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序。汇编语言虽然较机器语言直观,但仍然烦琐难懂。于是人们研制出了高级程序设计语言。高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。
汇编语言的特点:
(1)汇编语言与处理器密切相关。
(2)汇编语言程序效率高。
(3)编写汇编语言源程序比编写高级语言源程序烦琐。
(4)调试汇编语言程序比调试高级语言程序困难。
(1)汇编语言与处理器密切相关。
(2)汇编语言程序效率高。
(3)编写汇编语言源程序比编写高级语言源程序烦琐。
(4)调试汇编语言程序比调试高级语言程序困难。
汇编语言的主要应用场合:
(1)程序执行占用较短的时间,或者占用较小存储容量的场合。
(2)程序与计算机硬件密切相关,程序直接控制硬件的场合。
(3)需提高大型软件性能的场合。
(4)没有合适的高级语言的场合。
(1)程序执行占用较短的时间,或者占用较小存储容量的场合。
(2)程序与计算机硬件密切相关,程序直接控制硬件的场合。
(3)需提高大型软件性能的场合。
(4)没有合适的高级语言的场合。
2.数值数据:
数值数据分为有符号数和无符号数。无符号数最高位表示数值,而有符号数最高位表示符号。有符号数有不同的编码方式,常用的是补码。
n位二进制数能够表示的无符号整数的范围是:
0 ≤I ≤ 2n-1
n位二进制数能够表示的有符号整数的范围是:
-2(n-1) ≤ I ≤+2(n-1)-1
0 ≤I ≤ 2n-1
n位二进制数能够表示的有符号整数的范围是:
-2(n-1) ≤ I ≤+2(n-1)-1
ASCII码:
标准ASCII码用7位二进制数编码,共有128个。
计算机存储器基本单位为8位,ASCII码的最高位通常为0,通信时,最高位用作奇偶校验位。
ASCII码表中的前32个和最后1个编码是不能显示的控制字符,用于表示某种操作。
ASCII码表中20H后的94个编码是可显示和打印的字符,其中包括数码0~9,英文字母,标点符号等。
标准ASCII码用7位二进制数编码,共有128个。
计算机存储器基本单位为8位,ASCII码的最高位通常为0,通信时,最高位用作奇偶校验位。
ASCII码表中的前32个和最后1个编码是不能显示的控制字符,用于表示某种操作。
ASCII码表中20H后的94个编码是可显示和打印的字符,其中包括数码0~9,英文字母,标点符号等。
BCD码:
虽然二进制数实现容易,但不符合人们的使用习惯,且书写阅读不方便,所以在计算机输入输出时通常还是采用十进制来表示数,这就需要实现十进制与二进制间的转换。为了转换方便,常采用二进制编码的十进制,简称为BCD码。
BCD码就是用4位二进制数表示1位十进制整数。表示的方法有多种,常用的是8421BCD码。
虽然二进制数实现容易,但不符合人们的使用习惯,且书写阅读不方便,所以在计算机输入输出时通常还是采用十进制来表示数,这就需要实现十进制与二进制间的转换。为了转换方便,常采用二进制编码的十进制,简称为BCD码。
BCD码就是用4位二进制数表示1位十进制整数。表示的方法有多种,常用的是8421BCD码。
3.8086体系结构:
总线接口部件(BIU) 执行部件(EU)
_________________ ___________________
| 段寄存器 | | |
|________________| | 通用寄存器组 |
| 指令指针 | | |
|________________| |___________________|
|| || || ||
|| || || ||
|| || || ||
_________________ || ||
| |__________________________________________________
| 地址产生与 |________________________________________________ |
| 总线控制 | || || | |
|________________| __________________ | |
|| || | 操作数 | | |
|| || __________________ | |
|| || || || | |
|| || || || | |
_________________ ___________________ | |
| | | | | |
| 指令队列 |_____________| 标志寄存器 |______________| |
| |_____________| |_______________ |
|________________| |___________________|
|| ||
|| ||
|| ||
___________________
| |
| 逻辑算术单元 |
| |
___________________
_________________ ___________________
| 段寄存器 | | |
|________________| | 通用寄存器组 |
| 指令指针 | | |
|________________| |___________________|
|| || || ||
|| || || ||
|| || || ||
_________________ || ||
| |__________________________________________________
| 地址产生与 |________________________________________________ |
| 总线控制 | || || | |
|________________| __________________ | |
|| || | 操作数 | | |
|| || __________________ | |
|| || || || | |
|| || || || | |
_________________ ___________________ | |
| | | | | |
| 指令队列 |_____________| 标志寄存器 |______________| |
| |_____________| |_______________ |
|________________| |___________________|
|| ||
|| ||
|| ||
___________________
| |
| 逻辑算术单元 |
| |
___________________
4.8086寄存器组:
AX:累加器,常用于保存临时数据 §
BX:基址寄存器,主要用作指针,也可用作数据存储 §__数据寄存器______§
CX:计数器 § §
DX:数据寄存器,用于端口操作或临时数据 § §
§ §_通用寄存器
SP:堆栈指针,指向堆栈当前地址 §__堆栈指针寄存器__§
BP:基址指针,常用于指向高级语言堆栈帧 § §
SI:源操作数指针 §__变址寄存器______§
DI:目的操作数指针 § §
IP:指令指针 §__控制寄存器
FLAGS:标志寄存器 §
CS:代码段寄存器 §
DS:数据段寄存器 §__段寄存器
SS:堆栈段寄存器 §
ES:附加段寄存器 §
说明:
变址和指针寄存器包括SI、DI、SP、BP4个16位寄存器,主要用于存放某个存储单元的偏移地址。
SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。
SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。
变址和指针寄存器包括SI、DI、SP、BP4个16位寄存器,主要用于存放某个存储单元的偏移地址。
SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。
SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。
CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。
8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。
标志寄存器:
8086CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征。
A.条件标志
8086CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征。
A.条件标志
(1)进位标志CF
(2)零标志ZF
(3)符号标志SF
(4)溢出标志 OF
(5)奇偶标志 PF
(6)辅助进位标志AF
B.状态控制标志
(2)零标志ZF
(3)符号标志SF
(4)溢出标志 OF
(5)奇偶标志 PF
(6)辅助进位标志AF
B.状态控制标志
(1)方向标志DF
(2)中断允许标志IF
(3)追踪标志TF
(2)中断允许标志IF
(3)追踪标志TF
5.物理地址的形成:
把1M字节地址空间划成若干逻辑段。每个逻辑段必须满足两个条件:一是逻辑段的起始地址(简称段首址)必须是16的倍数;二是逻辑段的最大长度为64K。按照这两个条件,1M字节地址空间最多可划分成64K个逻辑段,最少也要划分成16个逻辑段。逻辑段与逻辑段可以相连,也可以不连,还可以重叠。计算方法:段乘以16加上偏移即物理地址。
6.寻址方式:
A.立即寻址:
例如:mov ax,35
B.寄存器寻址:
例如:mov ax,bx
C.直接存储器寻址:
例如: value dw 10h
mov ax, value ;//利用ds段寄存器(默认)计算它在memory中的实际位置
mov ax, ds:33h ;
mov ss:2, ax ;//ss * 16 + 2
D.间接存储器寻址:
(1)寄存器间接寻址
例如: mov ax, [bp] ;//ax值为(ss*16 +bp)指向的地址
(2)变址寻址
例如: table db 100 dup (?)
mov ax, table[bx] ;//bx是数字下标
(3)基址变址
例如: mov ax, [bx][si] ;//bx * 16 + si
(4)带位移基址变址
例如: mov ax,table[bx][si] ;//指向table + bx + si
mov ax,10[bp][di] ;//指向10 + bp + di
E:跨段问题:
MOV AX,DS:[BP]
MOV CX,SS:[SI]
该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:
PA1 =(DS)左移4位+[BP]
PA2 =(SS)左移4位+[SI]
MOV AX,DS:[BP]
MOV CX,SS:[SI]
该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:
PA1 =(DS)左移4位+[BP]
PA2 =(SS)左移4位+[SI]
7.指令系统之数据传送类指令:
A.通用数据传送指令:
1.传送指令MOV
2.数据交换指令XCHG ----功能:将源地址与目的地址中的内容互换
3.查表转换指令 XLAT
1.传送指令MOV
2.数据交换指令XCHG ----功能:将源地址与目的地址中的内容互换
3.查表转换指令 XLAT
B.堆栈操作指令:
1.进栈指令PUSH
2.出栈指令POP
1.进栈指令PUSH
2.出栈指令POP
C.标志寄存器传送指令:
1.标志送AH指令LAHF
2.AH送标志指令SAHF
3.标志寄存器进栈指令PUSHF
4.标志寄存器出栈指令POPF
1.标志送AH指令LAHF
2.AH送标志指令SAHF
3.标志寄存器进栈指令PUSHF
4.标志寄存器出栈指令POPF
D.地址传送指令:
1.传送偏移地址指令 LEA
例如: a db ?
lea bx, a ;bx is a's address
2.传送偏移地址及数据段首址指令LDS
语句格式:LDS OPD,OPS
功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。
1.传送偏移地址指令 LEA
例如: a db ?
lea bx, a ;bx is a's address
2.传送偏移地址及数据段首址指令LDS
语句格式:LDS OPD,OPS
功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。
3.传送偏移地址及附加数据段指令LES ---- 功能:将主存某字单元内容送指定寄存器。
语句格式:LES OPD,OPS
功能:将主存某字单元内容送指定寄存器。即(OPS)→OPD,(OPS+2)→ES。
语句格式:LES OPD,OPS
功能:将主存某字单元内容送指定寄存器。即(OPS)→OPD,(OPS+2)→ES。
E.输入输出指令:
1.输入指令IN
2.输出指令OUT
1.输入指令IN
2.输出指令OUT
8.指令系统之算术运算类指令:
A.加法指令
1.加1指令 INC
2.加指令ADD
3.带进位加指令ADC
1.加1指令 INC
2.加指令ADD
3.带进位加指令ADC
B.减运算指令
1.减1指令DEC
2.减指令SUB
3.求补指令NEG
4.带借位减指令 SBB
5.比较指令 CMP ---- 结果只影响标志位
1.减1指令DEC
2.减指令SUB
3.求补指令NEG
4.带借位减指令 SBB
5.比较指令 CMP ---- 结果只影响标志位
C.乘运算指令
1.无符号数乘法指令MUL
2.有符号乘指令IMUL
1.无符号数乘法指令MUL
2.有符号乘指令IMUL
D.除运算指令
1.无符号除指令DIV
2.有符号除指令IDIV
1.无符号除指令DIV
2.有符号除指令IDIV
E.符号扩展指令
1.字节转换成字指令CBW ---- 将AL中的符号位数据扩展至AH
2.将字转换成双字指令CWD ---- 将AX中的符号位数据扩展至DX
1.字节转换成字指令CBW ---- 将AL中的符号位数据扩展至AH
2.将字转换成双字指令CWD ---- 将AX中的符号位数据扩展至DX
F.十进制调整指令
1.压缩BCD码调整指令 DAA
2.非压缩BCD码调整指令 DAS
1.压缩BCD码调整指令 DAA
2.非压缩BCD码调整指令 DAS
G.非压缩BCD码调整指令
(1)加法的非压缩BCD码调整指令AAA
(2)减法的非压缩BCD码调整指令AAS
(3)乘法的非压缩BCD码调整指令AAM
(4)除法的非压缩BCD码调整指令AAD
(1)加法的非压缩BCD码调整指令AAA
(2)减法的非压缩BCD码调整指令AAS
(3)乘法的非压缩BCD码调整指令AAM
(4)除法的非压缩BCD码调整指令AAD
H.位操作类指令
逻辑运算指令
1.求反指令NOT
2.逻辑乘指令AND
3.测试指令TEST
4.逻辑加指令OR
5.按位加指令XOR
1.求反指令NOT
2.逻辑乘指令AND
3.测试指令TEST
4.逻辑加指令OR
5.按位加指令XOR
移位指令
1.算术左移和逻辑左移指令SAL(SHL)
语句格式:SAL OPD,1 或SHL OPD,1
SAL OPD,CL或SHL OPD,CL
功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。
2.算术右移指令SAR
语句格式:SAR OPD,1或SAR OPD,CL
CF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。
3.逻辑右移指令SHR
语句格式:SHR OPD,1或SHR OPD,CL
功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。
4.循环左移指令ROL
语句格式:ROL OPD,1或ROL LPD,CL
功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。
5.循环右移指令ROR
语句格式: ROR OPD,1或ROR OPD,CL
功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。
6.带进位的循环左移指令RCL
语句格式: RCL OPD, 1或RCL OPD,CL
功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。
7.带进位的循环右移指令RCR
语句格式:RCR OPD,1或RCR OD,CL
功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。
1.算术左移和逻辑左移指令SAL(SHL)
语句格式:SAL OPD,1 或SHL OPD,1
SAL OPD,CL或SHL OPD,CL
功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。
2.算术右移指令SAR
语句格式:SAR OPD,1或SAR OPD,CL
CF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。
3.逻辑右移指令SHR
语句格式:SHR OPD,1或SHR OPD,CL
功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。
4.循环左移指令ROL
语句格式:ROL OPD,1或ROL LPD,CL
功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。
5.循环右移指令ROR
语句格式: ROR OPD,1或ROR OPD,CL
功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。
6.带进位的循环左移指令RCL
语句格式: RCL OPD, 1或RCL OPD,CL
功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。
7.带进位的循环右移指令RCR
语句格式:RCR OPD,1或RCR OD,CL
功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。
9.指令系统之串操作类指令
1.传送指令MOVS
语句格式:① MOVSB——字节串传送
② MOVSW——字串传送
功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。
即:①(DS:[SI])→ES:[DI]。
② 当DF=0时,(SI)和(DI)增量。
当DF=1时,(SI)和(DI)减量。
2.串比较指令CMPS
语句格式:① CMPSB——字节串比较
② CMPSW——字串比较
功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。
即:①([SI])-([DI])。
② 修改串指针,使之指向串中的下一个元素。
当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。
3.串搜索指令SCAS
语句格式:① SCASB——字节串搜索
② SCASW——字串搜索
功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,
即:① 字节操作:(AL)-([DI]),字操作:(AX)-([DI])。
② 修改指针使之指向串中的下一个元素。
当DF=0时,(DI)增量。当DF=1时,(DI)减量。
4.从源串中取数指令LODS
语句格式:① LODSB——从字节串中取数
② LODSW——从字串中取数
功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。
即:① 字节操作:([SI])→AL,字操作:([SI])→AX。
② 修改指针SI,使它指向串中的下一个元素。
当DF=0时,(SI)增量。当DF=1时,(SI)减量。
5.往目的串中存数指令STOS
语句格式:① STOSB——往字节串中存数
②(2)STOSW——往字串中存数
功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。
即:① 字节操作:(AL)→[DI],字操作:(AX)→[DI]。
② 修改指针DI,使之指向串中的下一个元素。
当DF=0时,(DI)增量)。当DF=1时,(DI)减量。
6.重复前缀指令REP REPZ REPNZ
(1)REP
REP前缀用在MOVS、STOS 、LODS指令前。
功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。
(2)REPZ
该指令一般用在CMP、SCAS指令前。
功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。
(3)REPNZ
该指令一般用在CMPS、SCAS 指令前。
功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。
1.传送指令MOVS
语句格式:① MOVSB——字节串传送
② MOVSW——字串传送
功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。
即:①(DS:[SI])→ES:[DI]。
② 当DF=0时,(SI)和(DI)增量。
当DF=1时,(SI)和(DI)减量。
2.串比较指令CMPS
语句格式:① CMPSB——字节串比较
② CMPSW——字串比较
功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。
即:①([SI])-([DI])。
② 修改串指针,使之指向串中的下一个元素。
当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。
3.串搜索指令SCAS
语句格式:① SCASB——字节串搜索
② SCASW——字串搜索
功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,
即:① 字节操作:(AL)-([DI]),字操作:(AX)-([DI])。
② 修改指针使之指向串中的下一个元素。
当DF=0时,(DI)增量。当DF=1时,(DI)减量。
4.从源串中取数指令LODS
语句格式:① LODSB——从字节串中取数
② LODSW——从字串中取数
功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。
即:① 字节操作:([SI])→AL,字操作:([SI])→AX。
② 修改指针SI,使它指向串中的下一个元素。
当DF=0时,(SI)增量。当DF=1时,(SI)减量。
5.往目的串中存数指令STOS
语句格式:① STOSB——往字节串中存数
②(2)STOSW——往字串中存数
功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。
即:① 字节操作:(AL)→[DI],字操作:(AX)→[DI]。
② 修改指针DI,使之指向串中的下一个元素。
当DF=0时,(DI)增量)。当DF=1时,(DI)减量。
6.重复前缀指令REP REPZ REPNZ
(1)REP
REP前缀用在MOVS、STOS 、LODS指令前。
功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。
(2)REPZ
该指令一般用在CMP、SCAS指令前。
功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。
(3)REPNZ
该指令一般用在CMPS、SCAS 指令前。
功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。
9.指令系统之控制转移类指令:
A.条件转移指令 JA,JAE,JB,JBE,JC,JE,JG,JGE,JL,JLE,JNA,JNAE,JNB,JNBE,JNC,JNE,JNG,JNGE,JNL,JNLE,JNO,JNP,JNS,JNZ,JS,JO,JP,JPE,JPO,JCXZ
B.无条件转移指令 JMP
C.循环指令 LOOP,LOOPE,LOOPENE,LOOPNZ,
D.子程序调用指令 CALL,RET
E.中断指令 INT,IRET
B.无条件转移指令 JMP
C.循环指令 LOOP,LOOPE,LOOPENE,LOOPNZ,
D.子程序调用指令 CALL,RET
E.中断指令 INT,IRET
10.指令系统之处理机控制类指令:
A.标志位设置指令
1.进位标志操作指令
2.方向标志操作指令
3.中断标志操作指令
1.进位标志操作指令
2.方向标志操作指令
3.中断标志操作指令
B.CPU状态控制指令
1.空操作指令NOP
2.总线封锁前缀指令LOCK
3.暂停指令HLT
4.交权指令ESC
5.等待指令WAIT
1.空操作指令NOP
2.总线封锁前缀指令LOCK
3.暂停指令HLT
4.交权指令ESC
5.等待指令WAIT
11.宏汇编语言之变量定义,如下例:
DATA SEGMENT
STR1 DB ‘1234’
STR2 DW ‘AB’,‘CD’,‘A’
STR3 DD ‘AB’
DATA ENDS
STR1 DB ‘1234’
STR2 DW ‘AB’,‘CD’,‘A’
STR3 DD ‘AB’
DATA ENDS
12.符号地址:
NEXT:MOV AL, [SI] ;带标号NEXT的指令
DEC CX
JNE NEXT ;标号NEXT作转移指令的操作数
NEXT:MOV AL, [SI] ;带标号NEXT的指令
DEC CX
JNE NEXT ;标号NEXT作转移指令的操作数
13.用算术运算符进行数值表达式运算:
NUM1 EQU 25*4 –50 ;NUM1=50
NUM2 EQU NUM1 / 7 ;NUM2=7
NUM3 DB NUM1 MOD 7 ;NUM3=1
VAR1 DB 1,2,3,4,5
VAR2 DB ‘12345’
NUM4 EQU VAR2-VAR1 ;NUM4=5
NUM5 EQU 0FH
MOV AL,NUM5 SHL 4 ;(AL)=11110000B
MOV BL,NUM5 SHR 4 ;(BL)=00000000B
NUM1 EQU 25*4 –50 ;NUM1=50
NUM2 EQU NUM1 / 7 ;NUM2=7
NUM3 DB NUM1 MOD 7 ;NUM3=1
VAR1 DB 1,2,3,4,5
VAR2 DB ‘12345’
NUM4 EQU VAR2-VAR1 ;NUM4=5
NUM5 EQU 0FH
MOV AL,NUM5 SHL 4 ;(AL)=11110000B
MOV BL,NUM5 SHR 4 ;(BL)=00000000B
14.逻辑运算符:
MOV AL,34H AND 0FH ;04H→AL
MOV BL,05H OR 30H ;35H→BL
MOV CX,NOT 00FFH ;0FF00H→CX
MOV DX,789AH XOR 000FH ;7895H→DX
MOV AL,34H AND 0FH ;04H→AL
MOV BL,05H OR 30H ;35H→BL
MOV CX,NOT 00FFH ;0FF00H→CX
MOV DX,789AH XOR 000FH ;7895H→DX
15.关系运算符:
关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。
NUM1 DB 10 LT 5 ;NUM1=0
NUM2 DB 0AAAAH GT 7FFFH ;NUM2=0FFFFH
MOV AX,‘A‘ EQ 41H ;0FFFFH→AX
MOV BX,NUM2 LT NUM1 ;0→BX
关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。
NUM1 DB 10 LT 5 ;NUM1=0
NUM2 DB 0AAAAH GT 7FFFH ;NUM2=0FFFFH
MOV AX,‘A‘ EQ 41H ;0FFFFH→AX
MOV BX,NUM2 LT NUM1 ;0→BX
16.数值返回运算符:
(1)SEG 运算符
格式:SEG 变量或标号
功能:分离出其后变量或标号所在段的段首址。例如:
MOV AX,SEG ARR
MOV DS,AX
(2)OFFSET运算符
格式:OFFSET 变量或标号
功能:分离出其后变量或标号的偏移地址。例如:
MOV BX,OFFSET BUF
(1)SEG 运算符
格式:SEG 变量或标号
功能:分离出其后变量或标号所在段的段首址。例如:
MOV AX,SEG ARR
MOV DS,AX
(2)OFFSET运算符
格式:OFFSET 变量或标号
功能:分离出其后变量或标号的偏移地址。例如:
MOV BX,OFFSET BUF
(3)TYPE运算符
格式:TYPE 变量或标号
功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。
(4)LENGTH运算符
格式:LENGTH 变量
功能:取出变量所含的数据存储单元个数。
取出变量占存储单元个数。
DATA SEGMENT
A DB ‘ABCDEF’
B DW 10 DUP(1,2DUP(2))
C DB 3,20 DUP(0)
DATA ENDS
MOV AX,LENGTH A ;1→AX
MOV BX,LENGTH B ;10→BX
MOV CX,LENGTH C ;1→CX
格式:TYPE 变量或标号
功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。
(4)LENGTH运算符
格式:LENGTH 变量
功能:取出变量所含的数据存储单元个数。
取出变量占存储单元个数。
DATA SEGMENT
A DB ‘ABCDEF’
B DW 10 DUP(1,2DUP(2))
C DB 3,20 DUP(0)
DATA ENDS
MOV AX,LENGTH A ;1→AX
MOV BX,LENGTH B ;10→BX
MOV CX,LENGTH C ;1→CX
(5)SIZE运算符
格式:SIZE 变量
功能:取出变量所含的数据存储区大小。其返回值为:
LENGTH 变量 * TYPE 变量
例如:上例中A、B、C三变量:
SIZE A = LENGTH A*TYPE A = 1
SIZE B = LENGTH B*TYPE B = 20
SIZE C = LENGTH C*TYPE C = 1
格式:SIZE 变量
功能:取出变量所含的数据存储区大小。其返回值为:
LENGTH 变量 * TYPE 变量
例如:上例中A、B、C三变量:
SIZE A = LENGTH A*TYPE A = 1
SIZE B = LENGTH B*TYPE B = 20
SIZE C = LENGTH C*TYPE C = 1
(6)字节分离运算符
字节分离运算符包括:HIGH和LOW。
格式:HIGH 常量或地址表达式
LOW 常量或地址表达式
功能:HIGH 用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。
字节分离运算符包括:HIGH和LOW。
格式:HIGH 常量或地址表达式
LOW 常量或地址表达式
功能:HIGH 用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。
17.伪指令:
A.数据定义伪指令
常用的数据定义伪指令有DB,DW,DD,DQ,DT。
格式:[变量名] 数据定义伪指令 表达式 [,…]
功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。
B.符号定义伪指令
1).等价伪指令 格式:符号名 EQU 表达式
2).等号伪指令 格式:符号名 = 表达式
3). 定义符号名伪指令 格式:变量名或标号 LABEL 类型
C.段定义伪指令SEGMENT/END
1).段名
段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。
2).定位方式
(1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。
(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。
(3)BYTE:表示本段起始地址可以从任一地址处开始存放。
(4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。
D.类别
【例】对连接程序进行连接后存储区各段相对位置分布。
DATA1 SEGMENT ‘DATA’
CODE SEGMENT ‘CODE’
STACK1 SEGMENT ‘STACK’
DATA2 SEGMENT ‘DATA’
STACK2 SEGMENT ‘STACK’
经连接程序连接后,各段的相对位置如下:
DATA1 SEGMENT ‘DATA’
DATA2 SEGMENT ‘DATA’
STACK1 SEGMENT ‘STACK’
STACK2 SEGMENT ‘STACK’
CODE SEGMENT ‘CODE’
E.组合方式
组合方式有六种类型可供选择。
(1)“不选择”
(2)PUBLIC
(3)STACK
(4)COMMON
(5)MEMORY
(6)AT表达式
F.假定伪指令ASSUME
格式:ASSUME 段寄存器:段名 [,段寄存器:段名]
功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。
G.置汇编地址计数器伪指令ORG
格式:ORG 数值表达式
功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0~65535之间的非负整数。
A.数据定义伪指令
常用的数据定义伪指令有DB,DW,DD,DQ,DT。
格式:[变量名] 数据定义伪指令 表达式 [,…]
功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。
B.符号定义伪指令
1).等价伪指令 格式:符号名 EQU 表达式
2).等号伪指令 格式:符号名 = 表达式
3). 定义符号名伪指令 格式:变量名或标号 LABEL 类型
C.段定义伪指令SEGMENT/END
1).段名
段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。
2).定位方式
(1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。
(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。
(3)BYTE:表示本段起始地址可以从任一地址处开始存放。
(4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。
D.类别
【例】对连接程序进行连接后存储区各段相对位置分布。
DATA1 SEGMENT ‘DATA’
CODE SEGMENT ‘CODE’
STACK1 SEGMENT ‘STACK’
DATA2 SEGMENT ‘DATA’
STACK2 SEGMENT ‘STACK’
经连接程序连接后,各段的相对位置如下:
DATA1 SEGMENT ‘DATA’
DATA2 SEGMENT ‘DATA’
STACK1 SEGMENT ‘STACK’
STACK2 SEGMENT ‘STACK’
CODE SEGMENT ‘CODE’
E.组合方式
组合方式有六种类型可供选择。
(1)“不选择”
(2)PUBLIC
(3)STACK
(4)COMMON
(5)MEMORY
(6)AT表达式
F.假定伪指令ASSUME
格式:ASSUME 段寄存器:段名 [,段寄存器:段名]
功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。
G.置汇编地址计数器伪指令ORG
格式:ORG 数值表达式
功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0~65535之间的非负整数。
H.源程序结束伪指令
格式:END [表达式]
功能:该语句标志整个程序的结束,是源程序的最后一条语句。
格式:END [表达式]
功能:该语句标志整个程序的结束,是源程序的最后一条语句。
18.DOS系统功能调用
DOS系统功能调用的方法一般可分为以下几步
① 设置所要调用功能的入口参数。
② 在AH寄存器中存入所要调用功能的功能号。
③ INT 21H指令自动转入中断子程序入口。
④ 相应中断子程序运行完毕,可按规定取得出口参数。
常用的DOS系统功能调用
1.单字符输入(1号调用)
2.单字符显示(2号调用)
3.打印输出(5号调用)
4.结束调用(4CH号调用)
5.显示字符串(9号调用)
6.字符串输入(10号调用)
例子:在屏幕上显示字符串“Example of string display!”
DATA SEGMENT
STR DB 0DH,0AH,‘Example of string display!$’
DATA ENDS
DOS系统功能调用的方法一般可分为以下几步
① 设置所要调用功能的入口参数。
② 在AH寄存器中存入所要调用功能的功能号。
③ INT 21H指令自动转入中断子程序入口。
④ 相应中断子程序运行完毕,可按规定取得出口参数。
常用的DOS系统功能调用
1.单字符输入(1号调用)
2.单字符显示(2号调用)
3.打印输出(5号调用)
4.结束调用(4CH号调用)
5.显示字符串(9号调用)
6.字符串输入(10号调用)
例子:在屏幕上显示字符串“Example of string display!”
DATA SEGMENT
STR DB 0DH,0AH,‘Example of string display!$’
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
ASSUME DS:DATA,CS:CODE,SS:STACK
BEGIN:
MOV AX ,DATA
MOV DS,AX
LEA DX,STR
MOV AH ,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
例子:从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。
MOV DS,AX
LEA DX,STR
MOV AH ,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
例子:从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。
DATA SEGMENT
INFO1 DB 0DH,0AH,‘INPUT STRING:$’
INFO2 DB 0DH,0AH,‘OUTPUT STRING:$’
BUFA DB 81
DB ?
DB 80 DUP (0)
BUFB DB 81 DUP (0)
DATA ENDS
INFO1 DB 0DH,0AH,‘INPUT STRING:$’
INFO2 DB 0DH,0AH,‘OUTPUT STRING:$’
BUFA DB 81
DB ?
DB 80 DUP (0)
BUFB DB 81 DUP (0)
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:
ASSUME DS:DATA,SS:STACK,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA DX,INFO1
MOV AH,9 ; 9号调用,显示输入提示信息
INT 21H
LEA DX,BUFA
MOV AH,10 ; 10号调用,键盘输入字符串到缓 冲区BUFA
INT 21H
LEA SI,BUFA+1
MOV CH,0 ; 取字符长度→CX
MOV CL,[SI]
ADD SI,CX ;SI 指向字符串尾部
LEA DI,BUFB ;DI指向字符串变量BUFB
MOV DS,AX
LEA DX,INFO1
MOV AH,9 ; 9号调用,显示输入提示信息
INT 21H
LEA DX,BUFA
MOV AH,10 ; 10号调用,键盘输入字符串到缓 冲区BUFA
INT 21H
LEA SI,BUFA+1
MOV CH,0 ; 取字符长度→CX
MOV CL,[SI]
ADD SI,CX ;SI 指向字符串尾部
LEA DI,BUFB ;DI指向字符串变量BUFB
NEXT:
MOV AL,[SI]
MOV [DI],AL
DEC SI
INC DI
LOOP NEXT
MOV BYTE PTR [DI],‘$’
LEA DX,INFO2
MOV AH,9 ;9号调用,显示输出 提示信息
INT 21H
MOV [DI],AL
DEC SI
INC DI
LOOP NEXT
MOV BYTE PTR [DI],‘$’
LEA DX,INFO2
MOV AH,9 ;9号调用,显示输出 提示信息
INT 21H
LEA DX,BUFB
MOV AH,9 ;反向显示字符串
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
MOV AH,9 ;反向显示字符串
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
19.结构化程序设计:
相应的伪指令有:if,then,else,for,while,do,等,如c语言,略去不讲。
20.参数传递与堆栈:
函数参数可以用堆栈传递,如push ax,push bx后(这两个参数压入栈中),则调用过程后堆栈如下:
ax值 bp + 10
bx值 bp + 6
函数返回地址 bp + 2
bp值 bp
以后的push操作分别往下压入栈中。
21.一个简单例子演示汇编工具使用过程:
需要的工具:masm.exe和link.exe,分别是编译器和连接器
程序源码:
;
; first.asm -A first assembly language program
;
; code segment
;
_TEXT segment word public 'CODE'
assume cs:_TEXT,ds:_DATA,ss:_STACk
;
; ADD Two 16 bit values
;
addem proc far
mov ax,_DATA
mov ds,ax
mov ax,a
add ax,b
mov c,ax
mov ax,4c00h
int 21h
addem endp
_TEXT ends
; first.asm -A first assembly language program
;
; code segment
;
_TEXT segment word public 'CODE'
assume cs:_TEXT,ds:_DATA,ss:_STACk
;
; ADD Two 16 bit values
;
addem proc far
mov ax,_DATA
mov ds,ax
mov ax,a
add ax,b
mov c,ax
mov ax,4c00h
int 21h
addem endp
_TEXT ends
_DATA segment word public 'DATA'
a dw 3
b dw 4
c dw ?
_DATA ends
a dw 3
b dw 4
c dw ?
_DATA ends
_STACK segment para stack 'STACK'
db 128 dup(?)
_STACK ends
end addem
db 128 dup(?)
_STACK ends
end addem
输入上代码,打开dos窗口,命令行输入下语句:
e:/asm>masm first
e:/asm>link first
将会产生一个exe文件。
指向first,什么现象也没有,输入这个命令调试我们的程序:
debug first.exe
-t 指向一条语句
-d 0 显示内存数据
22.转载请保留完整文档,“天衣有缝”原创 2005.01.03 21:00 深圳南山科技园
23.本菜鸟的汇编语言复习之一到此结束,之二即将退出(简单叙述保护模式下汇编语言的程序设计),敬请关注~