ASM16 14-15 算术运算类指令
算术运算类指令
四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
请注意算术运算类指令对标志的影响
掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP
熟悉:MUL/IMUL、DIV/IDIV
理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD
加法指令ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
带进位加法指令ADC
ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加法运算
减法指令SUB(subtract)
SUB指令将目的操作数减去源操作数,结果送到目的操作数
SUB指令按照定义相应设置状态标志
带借位减法指令SBB
SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数
SBB ...
ASM16 13 数据传送类指令
数据传送类指令
数据传送是计算机中最基本、最重要的一种操作
传送指令也是最常使用的一类指令
传送指令把数据从一个位置传送到另一个位置
除标志寄存器传送指令外,均不影响标志位
重点掌握 MOV XCHG XLAT PUSH POP LEA
通用数据传送指令
提供方便灵活的通用传送操作
有3条指令 MOV XCHG XLAT
传送指令MOV(move)
把一个字节或字的操作数从源地址传送至目的地址
1234MOV reg/mem,imm ;立即数送寄存器或主存MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存MOV reg/seg,mem ;主存送(段)寄存器MOV reg/mem,seg ;段寄存器送寄存器或主存
非法传送
两个操作数的类型不一致
例如源操作数是字节,而目的操作数是字;或相反
两个操作数不能都是存储器
传送指令很灵活,但主存之间的直接传送却不允许
段寄存器的操作有一些限制
段寄存器属专用寄存器,对他们的操作能力有限
两个操作数的类型要一致
绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须一致,否则为非法指令
1MOV ...
ASM16 12 键盘输入并回显、操作文件
键盘输入并回显把01传给AH,则可以实现键盘输入并回显,如果输入成功则AL为输入的字符
12345678910111213141516171819202122232425262728MyStack segment stack ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器 db 256 dup(?)MyStack endsMyData segment ;数据段 db 03,04,05,06 string db "Hello World$"MyData endsMyCode segment ;代码段start: ;告诉编译器代码从此处开始 mov ax,MyData ;获取段基址 mov ds,ax ;将段基址送入寄存器 mov es,ax ;键盘输入并回显 mov ah,01 int 21h mov dx,offset ...
ASM16 11 hello world
写一个简单的hello world程序
123456789101112131415161718192021222324MyStack segment stack ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器 db 256 dup(?)MyStack endsMyData segment ;数据段 db 03,04,05,06 string db "Hello World$"MyData endsMyCode segment ;代码段start: ;告诉编译器代码从此处开始 mov ax,MyData ;获取段基址 mov ds,ax ;将段基址送入寄存器 mov es,ax mov dx,offset string ;==>mov dx,word ptr[0]==>mov dx,0 ;获取hello world在代码段的 ...
ASM16 8-10 寻址方式
x86指令编码(硬编码)的结构
opcode最少1个字节,最多3个字节。
opcode是指令中最重要的组成部分。
前缀指令只能影响自己,而opcode、ModR/M、SIB决定了整条指令的长度。
有没有ModR/M是由opcode决定的,有没有SIB是由ModR/M决定的。
定长指令、变长指令
定长指令(精简指令集 arm):它的长度永远没有变化,只要opcode的长度确定了,那么它的长度就确定了。
变长指令(复杂指令集 intel amd):仅仅通过opcode是没有办法确定长度的。
如何区分指令定长还是变长?
opcode后面没有ModR/M,该指令就是定长指令。如果opcode后面紧跟ModR/M,该指令就是变长指令
1234567操作码(1字节) 寻址方式 操作数操作码(1字节) 2bit(寻址方式) 3bit(源操作数) 3bit(目的操作数)寻址方式:11 => 寄存器=>寄存器10 => [bx+di+xxx]01 => [bx+di-xxx]00 => [bx+ ...
ASM16 7 地址与逻辑段
存储器组织与段寄存器
寄存器是微处理器内部暂存数据的存储单元,以名称表示
存储器则是微处理器外部存放程序及其数据的空间
程序及其数据可以长久存放在外存,在程序需要是才进入主存
主存需要利用地址区别
数据信息的表达单位
计算机中信息的单位
二进制位Bit:存储一位二进制数:0或1
字节Byte:8个二进制位,D7~D0
字Word:16位,2个字节,D15~D0
双字DWord:32位,4个字节,D31~D0
最低有效位LSB:数据的最低位,D0位
最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位
存储单位及其存储内容
每个存储单元都有一个编号;被称为存储器地址
每个存储单位存放一个字节的内容
多字节数据存放方式
多字节数据在存储器中占连续的多个存储单元:
存放时,低字节存入低地址,高字节存入高地址;
表达时,用它的低地址表示多字节数据占据的地址空间。
80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式Little Endian”
相对应还存在“大端方式Big Endian”
存储单元及其存储内容
每个存储单 ...
ASM16 5-6 汇编语言寄存器篇(标志寄存器)
标志寄存器
标志(Flag)用于反映指令执行结果或控制指令执行性形式
8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)
标志的分类
状态标志——用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它 CF ZF SF PF OF AF
控制标志——可由程序根据需要用指令设置,用于控制处理器执行指令的方式 DF IF TF
进位标志CF(Carry Flag)
当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0.
零标志ZF(Zero Flag)
若运算结果为0,则ZF=1;否则ZF=0
符号标志SF(Sign Flag)
运算结果最高位为1,则SF=1;否则SF=0
奇偶标志PF(parity Flag)
当运算结果最低字节中“1”的个数为零或偶数时,PF=1;否则PF=0
溢出标志OF(Overflow Flag)
若算术运算的结果有溢出,则OF=1;否则OF=0
溢 ...
ASM16 3-4 汇编语言寄存器篇
什么是指令系统
计算机的指令系统就是指该计算机能够执行的全部指令的集合
每种计算机都有它支持的指令集合
16位8086指令系统是Intel 80x86系列微处理器指令系统的基础
调试程序DEBUG
DEBUG是常用的汇编语言级调试工具,为汇编语言的程序员提供了分析指令、跟踪程序的有效手段
常用命令:
-A汇编
-U反汇编
-T单步执行
-G断点执行
-D数据显示
-R寄存器
8086的寄存器组
对程序员来说,8086内部结构的最重要的是其寄存器组
8个通用寄存器
1个指令指针寄存器
1个标志寄存器
4个段寄存器
8086的通用寄存器
8086的16位通用寄存器是:AX BX CX DX SI DI BP SP
其中前4个数据寄存器都还可以分成高8位和低8位两个独立的寄存器
8086的8位通用寄存器是:AH BH CH DH AL BL CL DL
对其中某8位的操作,并不影响另外对应8位的数据
数据寄存器
数据寄存器用来存放计算的结果和操作数,也可以存放地址
每个寄存器又有它们各自的专用目的
AX——累加器,使用频率最高,用于算术。逻辑运算以及与外设传送信息 ...
ASM16 1-2 汇编语言入门
什么是汇编语言
汇编语言的主要特点:
汇编语言程序与处理器指令系统密切相关
程序员可直接、有效地控制系统硬件
形成的可执行文件运行速度快、占用主存容量少
汇编语言和高级语言
汇编语言与处理器密切相关:汇编语言程序的通用性、可移植性较差
高级语言与具体计算机无关:高级语言程序可以在多种计算机上编译后执行
汇编语言功能有限、涉及硬件细节:编写程序比较繁琐,调试起来也比较困难
高级语言提供了强大的功能,不必关心琐碎问题:类似自然语言的语法,易于掌握和应用
汇编语言本质上就是机器语言:
可以直接、有效地控制计算机硬件
易于产生速度快、容量小的高效率目标程序
高级语言不针对具体计算机系统
不易直接控制计算机的各种操作
目标程序比较庞大、运行速度较慢
汇编语言的优点:
直接控制计算机硬件部件
可以编写在“时间”和“空间”两方面最有效的程序
汇编语言的缺点:
与处理器密切有关
需要熟悉计算机硬件系统、考虑许多细节
编写繁琐,调试、维护、交流和移植困难
汇编语言的优点使得它在程序设计中占有重要的位置,是不可被取代的
汇编语言的缺点使得人们主要采用高级语言进行程序开发工作
有时需要 ...
网络 5 udp和tcp的区别
udp和tcp的区别区别
udp-无连接,数据报,不安全不可靠不稳定
tcp-面向连接,数据流,安全可靠稳定
udp
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061// Server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <iostream>using namespace std;#define WIN32_LEAN_AND_MEAN//仅保留windows.h中的必要的头文件//如果不加这一行则要把Winsock2.h放到windows.h前面,否则会因重定义而报错#include <windows.h>#include <Winsock2.h>#pragma comment(lib,"Ws2_32.lib& ...