80x86汇编语言程序设计汇总
合集下载
80x86汇编语言程序设计

指令RET(Return):过程返回 (2)RET指令 ) 指令 ( ) 语法格式: 语法格式: RET RET imm16 ; 近返回或远返回 imm16 ; 近返回或远返回 , 并调整堆栈 : SP = SP + 近返回或远返回, 并调整堆栈:
功能描述: 功能描述: RET:返回地址出栈,从而实现转移到返回地址处。其中, :返回地址出栈,从而实现转移到返回地址处。其中, 远返回: 个双字到CS:IP。 远返回:POP 1个双字到 个双字到 。 近返回: 个字到IP。 近返回:POP 1个字到 。 个字到 RET imm16:在返回地址出栈后,CPU立即将 立即将imm16加到堆栈 :在返回地址出栈后, 立即将 加到堆栈 指针SP。这种机制用来在返回前将参数从栈中移出。 指针 。这种机制用来在返回前将参数从栈中移出。 对标志位的影响: 对标志位的影响:无。 说明: 由汇编程序根据其所在过程的类型( 说明 :RET由汇编程序根据其所在过程的类型( NEAR或FAR) 由汇编程序根据其所在过程的类型 或 ) 决定是近返回还是远返回。缺省为近返回。 决定是近返回还是远返回。缺省为近返回。
LOOP lab2 lab1:MOV AH,4CH INT cseg ENDS END main 21H
【例6.2】编写一个子程序,对一个无符号的字型数组的各元素求和。在调 】编写一个子程序,对一个无符号的字型数组的各元素求和。 用子程序之前,已把数组的段地址放在 中 起始偏移地址放在寄存器SI 用子程序之前,已把数组的段地址放在DS中,起始偏移地址放在寄存器 数组元素个数(>0)放在 中。要求子程序把计算结果以双字的形式存 放在CX中 中,数组元素个数 放在 高位放在DX中 低位放在AX中 放,高位放在 中,低位放在 中。 sum PROC NEAR PUSH XOR MOV MOV BX AX,AX DX,AX BX,AX ;求和前先把存放结果的 求和前先把存放结果的DX,AX清0 求和前先把存放结果的 清 ;保护用到的寄存器 保护用到的寄存器BX 保护用到的寄存器
80x86汇编语言程序设计

ADD AX, ES: [BX+200H] ;访问附加数据段,从[BX+200H] 取一字与AX相加 -> AX
3.1 寻址方式与指令格式
3.1.2 寻址方式 1. 操作数寻址
(3)存储器寻址(Memory Addressing) (d)变址寻址(Indexed Addressing) MOV AL, [CX*2+10H] ; 访问数据段
设32位的目的操作数存放在DX和AX中,DX存放高位字,
32位源操作数存放在BX和CX中,BX存放高位字
CF
ADC
ADD
DX
AX
+ BX
CX
DX
AX指令序列为: ADD NhomakorabeaX, CX ;低位加 ADC DX, BX ;高位加
ADC指令示例——双字加法:
执行前(DX)=0418H, (AX)=0F365H (BX)=1005H, (CX)=0E024H
MOV AX,DATAS MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H MOV AH,4CH INT 21H CODES ENDS END START
3.2.2 汇编语言程序上机过程
步骤2 利用masm.exe将源程序(*.asm)汇编为目标文件(*.obj);
第3章 80x86汇编语言程序设计
3.0 汇编语言
3.0.1 基本概念 1. 机器码(Machine Code)
以二进制代码形式表示的计算机能执行的指令
2. 汇编语言( Assembly Language)
用于助记机器码,与机器指令一一对应
汇编源程序 (汇编语言)
汇编程序 (Assembler)
3.1 寻址方式与指令格式
3.1.2 寻址方式 1. 操作数寻址
(3)存储器寻址(Memory Addressing) (d)变址寻址(Indexed Addressing) MOV AL, [CX*2+10H] ; 访问数据段
设32位的目的操作数存放在DX和AX中,DX存放高位字,
32位源操作数存放在BX和CX中,BX存放高位字
CF
ADC
ADD
DX
AX
+ BX
CX
DX
AX指令序列为: ADD NhomakorabeaX, CX ;低位加 ADC DX, BX ;高位加
ADC指令示例——双字加法:
执行前(DX)=0418H, (AX)=0F365H (BX)=1005H, (CX)=0E024H
MOV AX,DATAS MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H MOV AH,4CH INT 21H CODES ENDS END START
3.2.2 汇编语言程序上机过程
步骤2 利用masm.exe将源程序(*.asm)汇编为目标文件(*.obj);
第3章 80x86汇编语言程序设计
3.0 汇编语言
3.0.1 基本概念 1. 机器码(Machine Code)
以二进制代码形式表示的计算机能执行的指令
2. 汇编语言( Assembly Language)
用于助记机器码,与机器指令一一对应
汇编源程序 (汇编语言)
汇编程序 (Assembler)
80X86汇编语言程序设计

MOV WORD PTR[DI],0 而 MOV [DI],0 ;类型不定
例:STRI1 DW
? ;定义为字类型
可用如下语句:
PP EQU BYTE PTR STRI1
QQ EQU BYTE PTR STRI1+1
通过PP,QQ把STRI1和STRI1+1又规定为字节类型。
MOV STRI1,AX
则:TYPEBUFER2等于2LENGTH BUFFER2
等于200
SIZE
BUFFER2
等于400
(5)合成运算符
用来建立或临时改变变量或标号的类型或存储器操作的存储单 元类型。包括:PTR、THIS、SHORT。
PTR运算符 用来指定或修改存储器操作数的类型,通常和伪指令BYTE、 WORD等连起来使用。 例:MOV BYTE PTR[DI],0
–宏指令语句 它是一个指令序列,汇编时凡有宏指令语 句的地方都将用相应的指令序列的目标代码插入。
指令性语句是计算机可执行的,而伪指令不能执行,用
来定义变量,分配存储单元,指示程序开始和结束等。
这两种语句的差别: 在形式上:带不带冒号,是否可转向它. 在本质上:汇编时能否形成对应的机器码.
2.语句的格式
第4章 80X86汇编语言程序设计
• 本章的内容有: –MASM宏汇编语句结构以及开发过程 –MASM汇编语言表达式、运算符 –程序段的定义和属性 –复杂数据结构 –宏汇编 –基本汇编语言程序设计 –子程序设计 –高级汇编语言程序设计
4.1 MASM宏汇编语句结构以及开发过程
4.1.1 汇编语言程序的语句类型和格式 1.语句的类型
MASM提供等价机制,用来为常量定义符号名,符号 定义伪指令有“EQU”和“=”
例:STRI1 DW
? ;定义为字类型
可用如下语句:
PP EQU BYTE PTR STRI1
QQ EQU BYTE PTR STRI1+1
通过PP,QQ把STRI1和STRI1+1又规定为字节类型。
MOV STRI1,AX
则:TYPEBUFER2等于2LENGTH BUFFER2
等于200
SIZE
BUFFER2
等于400
(5)合成运算符
用来建立或临时改变变量或标号的类型或存储器操作的存储单 元类型。包括:PTR、THIS、SHORT。
PTR运算符 用来指定或修改存储器操作数的类型,通常和伪指令BYTE、 WORD等连起来使用。 例:MOV BYTE PTR[DI],0
–宏指令语句 它是一个指令序列,汇编时凡有宏指令语 句的地方都将用相应的指令序列的目标代码插入。
指令性语句是计算机可执行的,而伪指令不能执行,用
来定义变量,分配存储单元,指示程序开始和结束等。
这两种语句的差别: 在形式上:带不带冒号,是否可转向它. 在本质上:汇编时能否形成对应的机器码.
2.语句的格式
第4章 80X86汇编语言程序设计
• 本章的内容有: –MASM宏汇编语句结构以及开发过程 –MASM汇编语言表达式、运算符 –程序段的定义和属性 –复杂数据结构 –宏汇编 –基本汇编语言程序设计 –子程序设计 –高级汇编语言程序设计
4.1 MASM宏汇编语句结构以及开发过程
4.1.1 汇编语言程序的语句类型和格式 1.语句的类型
MASM提供等价机制,用来为常量定义符号名,符号 定义伪指令有“EQU”和“=”
80x86汇编语言子程序设计

过程与过程调用相关汇编语句
过程调用与返回指令
过程调用指令 段内直接调用的过程调用指令 段内间接调用的过程调用指令 段间直接调用的过程调用指令 段间间接调用的过程调用指令 过程调用指令属于“程序控制”指令组 过程调用指令不影响任何标志 过程调用指令所完成的操作: 将当前IP/EIP 内容(返回地址)压入堆栈 转移控制到被调用过程
过程与过程调用相关汇编语句
子程序的组织
汇编语言提供两条伪指令语句供组织一个过程的代码: 过程定义开始伪指令语句PROC 过程定义结束伪指令语句ENDP 过程定义开始伪指令语句放在一个过程的“体” (所 有内容)之前,过程定义结束伪指令语句放在一个过程的‚ 体‛之后,如同 一对括号括起一个过程的内容 过程定义开始伪指令语句的格式: 过程名 PROC [NEAR | FAR] 过程定义结束伪指令语句的格式: 过程名 ENDP ―[NEAR | FAR]‖用于指出一个过程的“类型” ,过程 的缺省类型为“NEAR‖ (近过程)
过程与过程调用相关汇编语句
作为一个面向数据处理应用设计的系列处理机,80x86 的 子程序支持机制是颇具特色的。它既考虑了子程序作为一个 软件产品的独立组成模块的软件工程需求,也考虑了其作为 一个独立模块内部构件的程序实现需求;既考虑了直接的子 程序调用的编程需要,也考虑了间接的子程序调用的编程需 求;既考虑了子程序返回时的简单控制转移,也考虑了使用 堆栈传递参数情况下返回控制时的堆栈平衡的需要。学生在 掌握这部分相关知识时,应当注意对之的系统把握。本节将 讨论以下几个问题:
过程与过程调用相关汇编语句
过程调用与返回指令
段间间接调用的过程调用指令 指令格式: CALL < 操作数> 指令中的<操作数>在16位机器中为“双字”类型, 只能是存储器操作数,存储器操作数的5种寻址方式均 可用;当操作数的寻址方式为“直接寻址”时,除非已 明确其类型为“双字” ,否则,应使用“DWORD PTR‖指定其类型;其它情况下,通常使用“DWORD PTR‖来指定其类型 8086/88机器完成的操作: (SP)- 2 →SP,(CS)→(SP) (SP)- 2 →SP,(IP)→(SP) (参数值高16位)→ CS (参数值低16位) → IP
80X86 32位汇编程序设计

Calling Convention
●
Windows ABI
Windows 定义了 3 种 Call Convention
–
C calling convention (__cdecl)
●
编译器默认的 calling convention WinAPI 的 calling convention 不常用
– –
●
387 浮点运算指令 (80 位 )
80x86 指令集概述
●
必须学习的指令
–
基本指令 SSE/SSE2/SSE3 特权指令 387 , MMX , 3DNow
● ●
●
有兴趣可以选学的指令
– –
●
不太值得学习的指令
–
将要被 SSE 系列指令淘汰 387 指令非常难用
80x86 处理器模式
32 位汇编与 16 位汇编的区别
80X86 32 位汇编程序设计
仲力 沈英哲 2006.4.21
Outline
●
80x86 指令概述 Windows 下的 32 位汇编
–
●
ABI & Examples
●
386 Linux 下的汇编 Optimization Guide x86-64(AMD64, Intel EMT64) Advanced topics and bibliography
– – –
●
标准 C 库 libc(printf, ...) Win32API POSIX API
Application Binary Interface
●
为了能和 C 语言互相调用,汇编程序必须符合 OS 规定的 ABI 规范。 ABI 规范一般包括
汇编语言程序设计_第3章 80x86指令系统

3.3.2 算术指令
1. 加法
一般形式:
ADD dest, src ; dest = dest + src
ADC dest, src ; dest = dest + src + CF
INC
dest
; dest = dest + 1
语法格式:
ADD reg/mem, reg/mem/imm
ADC reg/mem, reg/mem/imm
movsx ax, al ; 等价于cbw movsx eax, ax ; 等价于cwde movsx eax, al ; 等价于顺序执行cbw与cwde
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(3)MOVZX 一般形式: MOVZX dest, src ; src零扩展为dest;386新增 语法格式: MOVZX reg16, reg8/mem8 MOVZX reg32, reg8/mem8/reg16/mem16
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单
元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地
INC
reg/mem
对标志位的影响:
ADD、ADC:按一般规则影响CF、OF、SF和ZF。 INC:不影响CF,其它同ADD。 说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。
2019/8/26
80x86汇编语言程序设计 第2章 80x86计算机系统组织

2020/9/5
80x86汇编语言程序设计
1. 状态标志取值的一般规则
▪ ZF(Zero Flag):零标志。若运算结果为0,则ZF = 1,否则ZF = 0。
▪ SF(Sign Flag):符号标志。若运算结果为负数,则SF = 1,否则SF = 0。
▪ CF(Carry Flag):进位标志。若加法时结果最高位向前有进位或减法时最高位向 前有借位,则CF = 1,否则CF = 0。
第2章 80x86计算机系统组织
讲授要点
▪ 80x86计算机的基本结构(CPU、内存、I/O以及连接它们的总线)。 ▪ 80x86 CPU的寄存器组。 ▪ 实模式的内存分段与编程要点。 ▪ 标志位CF、OF、SF、ZF的含义及判断方法。
2020/9/5
80x86汇编语言程序设计
2.1 80x86计算机的基本结构
▪ 在实模式下,32位CPU下的程序可以使用32位寄存器和32位操作数,但采用32位寄 存器表示偏移地址时,只使用低16位,高16位为0。CS:IP总是指向下一条要执行的指 令,EIP的高16位为0。SS:SP指向堆栈段的栈顶,ESP的高16位为0。
▪ 状态标志是CPU进行条件判断和控制程序执行流程的依据,最常用的是4个:CF、OF、 SF和ZF。其中,CF表示无符号溢出,OF表示带符号溢出。
▪ SS:SP指向堆栈段的栈顶地址,ESP的高16位为0。
▪ 在32位80x86 CPU下,程序可以使用32位寄存器和32位操作数,但采用32位寄 存器表示偏移地址时,只使用低16位,高16位为0。
2020/9/5
80x86汇编语言程序设计
2.4 标志位
2.4.1 状态标志
▪ 状态标志通常由CPU根据指令执行结果自动设置,以反映指令执行结果的特 征。 ▪ 80x86 CPU将状态标志作为条件判断的依据,以控制程序的执行流程。 ▪ 最常用的状态标志是CF、OF、SF和ZF,应熟练掌握。
80x86汇编语言程序设计第5章.

说明:输入一个字符后,不需要回车。若只键入回车,则AL = 0DH。
2018/9/14
80x86汇编语言程序设计
5.1.2 字符与字符串的输入/输出方法
2. 显示一个字符
功能号:02H 入口参数:DL = 要显示字符的ASCII码 功能:在当前光标位置显示DL中的字符,光标右移。 调用方法示例: mov mov int dl, 'A' ah, 2 21h 说明:显示字符0DH和0AH将产生回车和换行的作用。 ; 显示字符'A'
2018/9/14 80x86汇编语言程序设计
5.4.1 串操作指令及其用途
(2)LODS(Load String):串装入 语法格式: LODSB LODSW LODSD 功能描述: AL/AX/EAX = DS:[SI]; if ( DF = 0 )then SI = SI + size; else SI = SI – size; endif 其中, size = 1(B)、2(W)或4(D)。 也就是说, LODS ( B/W/D )将 DS:SI 所指源串的 1 个元素(字节 / 字 / 双字)复制到 AL/AX/EAX。然后,SI增加或减少1/2/4。若DF = 0,则增加,否则减少。 对标志位的影响:无。
功能:从键盘读入一个字符串,存入DS:DX所指的缓冲区。
调用方法示例: buf db mov 10, ?, 10 dup (?) ax, seg buf ; 定义输入缓冲区
mov
lea mov int
ds, ax
dx, buf ah, 0ah 21h
2018/9/14
80x86汇编语言程序设计
5.1.2 字符与字符串的输入/输出方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4)集成模数转换器(ADC) 打开混合集成器件库,取出模数转换器(ADC),如图 所示。在实验电路工作区搭建实验电路。图中,输入模拟 电压的大小,由设置电压源VIN的大小决定;SOC和OE直 接接+5V工作电源,使ADC能够连续取样和输出;输出二 进制数码以两位十六进制数码显示。 设置VIN=2V,打开仿真开关,进行仿真实验,两位 十六进制数码显示器显示为66。
成比例关系式。 目前常见的D/A转换器中,有权电阻网络D/A转换器,倒T 形电阻网络D/A转换器、权电流型D/A转换器、权电容网络D/A 转换器和开关树型D/A转换器等多种类型。 R-2R倒T形D/A转换器是集成D/A转换器电路中应用最为 广泛的一种。 常用的集成D/A转换器一般都是由倒T形电阻网络、模拟开 关和数据寄存器组成。 A/D转换电路是把连续变化的模拟信号转换成相应的数字信 号的一种电路组成。A/D转换电路通常由取样、保持、量化和编 码四个部分组成。 常用的A/D转换器有并联比较型A/D转换器、逐次比较型 A/D转换器和双积分型A/D转换器等多种类型。
2018/9/14
数字电路实验(江西现代职业技术学院)
设置VREF=10V、VIN=6V,打开仿真开关,进行仿 真测试,两位十六进制数码显示器显示为99。
2018/9/14
数字电路实验(江西现代职业技术学院)
观测仿真实验显示,分析、验证ADC转换器功能,并与 计算出来的理论值进行比较。
2018/9/14
选中8线-3线优先编码器74148,单击“帮助(?)” 按钮,弹出的74148逻辑功能真值表如图所示 。
打开仿真开关,进行仿真实验。注意观测在GS=0, 电路取样编码工作期间,随着输入模拟量Ui的增减变化, 输出数字量对应的增减变化。分析、验证3位并联比较 型A/D转换器功能。
2018/9/14 数字电路实验(江西现代职业技术学院)
当时钟频率为20Hz时,DAC输出电压波形如图所示
对照DAC输出的阶梯形电压波形,分析、验证 DAC的数模转换功能。
2018/9/14 数字电路实验(江西现代职业技术学院)
3)3位并联比较型A/D转换器 由分压电阻、集成运放电压比较器8线-3线优先编码器、 门电路和译码显示电路构成的3位并联比较型A/D转换器如图 所示。
2018/9/14
数字电路实验(江西现代职业技术学院)
电压比较器输出与编码器输出对应关系表
电压比较器输出状态 输入模拟信号
1 )VREF 15
编码器 数字量输出
Q2 0 Q1 0 A2 0 A1 0 A0 0
十进制 数显示
0
Q7 0
Q6 0
Q5 0
Q4 0
Q3 0
(0 ~
(
1 3 ~ )V REF 15 15 3 5 ( ~ )V REF 15 15
2018/9/14 数字电路实验(江西现代职业技术学院)
三、实验步骤
1) 4位R-2R倒T形D/A转换器 在实验工作区搭建实验电路。对应三组4位二进制数, 1111、1110、1101,分别设置模拟开关Si的状态,进行仿真 实验。
2018/9/14
数字电路实验(江西现代职业技术学院)
把所测数据记入表中,分析、验证R-2R倒T形D/A转换 器的工作原理。
数字电路实验(江西现代职业技术学院)
1
0 1
1
1 1
1
1 1
1
1 1
1
1 1
1
1 1
1
1 1
1
0 1
1
1 0
1
5 6
7
13 ( ~ 1)VREF 15
2018/9/14
数字电路实验(江西现代职业技术学院)
从数字器件库中选出74194,按图4.所示在实验电路工 作区搭建实验电路。打开仿真开关,进行仿真实验。
2018/9/14
数字电路实验(江西现代职业技术学院)
输入信号 工作状态 输出电压 U0(V)
D3 D2 D1 D0
I3
I2
I1
I0
I∑
1111
1110
1101
Kv=
2018/9/14 数字电路实验(江西现代职业技术学院)
2)集成数模转换器(DAC) 打开混合集成器件库,取出电压输出型DAC元件 。
在实验电路工作区搭建实验电路。取VREF=12V,输入 的二进制数字量为11011011。打开仿真开关,进行仿真实验, 观测测试数据,分析、验证集成DAC元件的转换功能。
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 1
0 0
1 1
0 1
1 1
1 1
1 1
0 0
0 1
0 1
1 0
1 0
1 0
1 2
3 4
(
5 7 ~ )V REF 15 15
(
7 9 ~ )V REF 15 15 9 11 ( ~ )V REF 15 15 11 13 ( ~ )V REF 15 15
0 0
2018/9/14
数字电路实验(江西现代职业技术学院)
集成数模转换器(DAC)实验电路
在实验工作区用一个十进制加法计数器74160和一个电压 输出型D/A转换器构成一个D/A转换功能测试电路 打开仿真开关,进行仿真实验。 当时钟频率为2Hz时,DAC输出电压波形如图所示:
2018/9/14
数字电路实验(江西现代职业技术学院)
实验九
数模与模数转换电路 EWB仿真实术学院)
一、实验目的
1)熟悉D/A转换与A/D转换的基本概念及其转换关系。 2)了解D/A转换与A/D转换集成器件的使用方法及功能。
2018/9/14
数字电路实验(江西现代职业技术学院)
二、实验说明
D/A转换电路是将输入的数字量转换成模拟量的一种电路组 成,其输出的模拟电压 Uo 或模拟电流 Io与输入的数字量成比例,