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& ...
网络 3-4 心跳包和tcp
心跳包和tcp心跳包这节用的还是上节课的代码,算是对上一节的补充扩展
keep-alive-保活
在ChatClient中添加类向导
123456void CChatClientDlg::OnTimer(UINT_PTR nIDEvent){ CPackage pkg(PT_HEARTBEAT, m_client); sendto(m_sockClient, (char*)&pkg, sizeof(pkg), 0, (sockaddr*)&m_siServer, sizeof(m_siServer)); CDialogEx::OnTimer(nIDEvent);}
添加类
12345678910111213//CLock.h#pragma once#include<Windows.h>class CLock{public: CLock(); ~CLock(); void Lock(); void Unlock();private: CRITICAL_SECTION m_cs;};
123456789101112 ...