ASM16-5、6 --标志寄存器
ASM16高低位:
AX为16位寄存器,AH和AL分别为AX的高八位和低八位
AX=AH+AL
低8位寄存器位AL、BL、CL和DL,高8位为AH、BH、CH和DH,它们只能用来存放8位数据,不能用来存放地址信息
而SP、BP等用于存放地址没有高低位之分
标志寄存器
标志(Flag)用于反映指令执行结果或控制指令执行性形式
8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)
标志的分类
状态标志——用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它 CF ZF SF PF OF AF
控制标志——可由程序根据需要用指令设置,用于控制处理器执行指令的方式 DF IF TF
状态标志:
进位标志CF(Carry Flag)
如果运算结果的最高位产生了一个进位或错位,那么,其值为1,否则其值为0
奇偶标志PF(Parity Flag)
由于反应运算结果中(转化为二进制),”1”的奇偶性,也就是个数。”1”的个数为偶数,PF为1。个数为奇数,PF为0.补充:只包含最低位的一个字节(二进制的后八位)
辅助 ...
ASM16-3、4 --ALU和寄存器
ASM16ALU 算数逻辑单元命名:算术逻辑单元(Arithmetic&Logic Unit),简称ALU组成:ALU有2个单元,算术单元(Arithmetic Unit)和逻辑单元(Logic Unit),算术单元负责计算机里的所有数字操作作用:计算机中负责运算的组件,处理数字/逻辑的最基本单元
功能:
算术操作:加法、减法、乘法、除法等。
逻辑操作:AND、OR、NOT、XOR、比较等。
数据转换:如浮点数与整数之间的转换。
cpu内部的算数操作都可以是加法(所谓的加法、减法、乘法、除法指令)
减法:通过反码的方式来将减法转换成加法运算,通过补码的方式消除了+0和-0的歧义。而在减法的运算结果中,还需要对结果进行补码。
乘法:计算机乘法是移位和累加实现的,每位的数字代表需要移动几位
除法:计算机除法的实现是移位和累减,首先对齐除数和被除数,对齐后相减,如果结果大于等于0,则记录商1;如果结果小于0,则记录商0之后右移,结果作为下次运算的被除数,并将商左移循环这个过程,直到除数移回原位,并记录余数
什么是指令系统
计算机的指令系统就是指该计算机能够执行的全部指 ...
ASM16-1、2 --汇编语言基础知识
ASM16汇编语言基础知识什么是汇编语言
汇编语言的主要特点:
汇编语言程序与处理器指令系统密切相关
程序员可直接、有效地控制系统硬件
形成的可执行文件运行速度快、占用主存容量少
由于机器码的复杂(0001 0010 0011 0100 ….)使用助记符来辅助
汇编语言助记符是用于表示汇编指令的简短符号。它们是由程序员选择的,用以代替机器语言中复杂的二进制指令码。这些助记符使代码更加容易理解和记忆,同时便于汇编器将其翻译成机器语言。
汇编语言的种类:
汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令。不同架构的CPU指令并不相同,如x86,powerpc,arm各有各的指令系统;甚至同一种架构的CPU有几套指令集,典型的如arm除了有32位的指令集外,还有一套16位的thumb指令集。但是作为开发语言的汇编,本质上是一套语法规则和助记符的集合,它可以包容不同的指令集。如果从CPU体系来划分,常见的汇编有两种:IBM PC汇编和ARM汇编。
汇编语言和高级语言
汇编语言与处理器密切相关:
汇编语言程序的通用性、可移植性较差
高级语言与具体计算 ...
Windows14 --钩子和服务
Windows钩子 - Windows hook编程技术的钩子就是在等待捕获系统中的某个消息或者动作
应用程序可以通过设置Hook对某个进程或窗口进行监视,即:对特定事件“挂钩”;一旦预定义特定事件发生,Windows操作系统即会向钩子hook发送通知消息,这时,应用程序可进行响应。
钩子类型
12345678910111213WH_CALLWNDPROC :系统将消息发送到指定窗口之前的“钩子”WH_CALLWNDPROCRET Hooks :消息已经在窗口中处理的“钩子” WH_CBT Hook :基于计算机培训的“钩子”WH_DEBUG Hook :差错“钩子”WH_FOREGROUNDIDLE Hook :前台空闲窗口“钩子”WH_GETMESSAGE Hook :接收消息投递的“钩子”WH_JOURNALPLAYBACK Hook :回放以前通过WH_JOURNALRECORD“钩子”记录的输入消息WH_JOURNALRECORD Hook :输入消息记录“钩子”WH_KEYBOARD Hook :键盘消息“钩子”WH_MOUSE Hook :鼠标消息“钩子”WH_MSGFI ...
Windows13 --补充 复习
WindowsTLS允许多线程程序中的每个线程拥有自己单独的变量实例,每个线程都可以访问和修改自己的变量,而不会干扰其他线程。
运行过ThreadFunc函数后dw的值仍为0x123456
12345678910111213141516171819202122232425262728293031// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <windows.h>#include <iostream>using namespace std;DWORD WINAPI ThreadFunc(LPVOID lpParam){ DWORD dw = (DWORD)TlsGetValue(0); TlsSetValue(0, (LPVOID)0x44557788); return 0;}int main(){ TlsSetValue(0, (LPVOID)0x123456); DWORD dw = (DWORD)TlsGetVa ...
Windows12 --C线程和MFC线程
WindowsC线程和MFC线程C多线程创建一个多线程的项目
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// CThread.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include<stdio.h>#include <windows.h>#include <conio.h>DWORD WINAPI ThreadFunc(LPVOID lpParam){ for (int i = 0; i < 0x100000; ++i) { Sleep(10); char szMsg[80]; wsprintf(szMsg, "Parameter = %d\r\n.", GetCurrentThreadId()); printf(szMsg); } ...
Windows11 --远程线程注入
Windows远程线程注入信号信号量为n,最多就只有n个线程执行 其他线程等待
12CreateSemaphore;ReleaseSemaphore;
创建信号:
参数2: 开始放出的信号个数
参数3: 最大的信号个数
释放信号:
1234567891011121314151617181920212223242526272829303132333435#include <iostream>#include<Windows.h>using namespace std;HANDLE g_hSem = NULL;DWORD WINAPI WorkThreadProc( LPVOID ipThreadParameter){ while (true) { WaitForSingleObject(g_hSem, INFINITE); printf("%d\t:洗剪吹...\r\n", GetCurrentThreadId()); Sleep(2000); R ...
Windows9~10 --同步问题
Windows同步多线程共享资源同步原因以一个双线程计数为例:
建立一个控制台应用:
线程回调:
创建两个线程
123456789101112131415161718192021222324252627282930313233343536373839404142434445// Counter.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include<Windows.h>#include <iostream>using namespace std;int g_nCounter = 0;DWORD WINAPI ThreadFunc(LPVOID lpParam){ for (int i = 0; i < 0x10000; i++) { ++g_nCounter; } printf("tid:%08x counter:%08x \r\n", GetCurrentThreadId(), g_nCounter); ...
Windows8 --线程的创建和退出
Windows线程的创建和退出概念区分程序:磁盘上的可执行文件(如.exe)
进程:程序执行代码所需资源的集合,不活泼的(状态)
线程:程序执行代码的最小单位,活泼的(状态)
进程为代码执行提供各种各样的资源 本身并不执行代码,由线程进行代码的执行
线程的运行(调度)原理CPU时间切片:系统将 CPU 的运行时间划分为固定长度的时间片,每个时间片结束时,当前运行的线程会被暂停,然后调度器会选择下一个就绪的线程继续执行
基于CPU时间片方式进行线程调度,就是当只有线程得到CPU的时间片才能执行指令,当线程处于执行的状态,但是却没有分配到时间片,那么就会处于就绪状态,等待系统分配下一个时间片。
保存环境和恢复环境:当线程被切走时,系统会把当前线程的环境保存,当线程再切回来时,恢复环境。
多线程效率与cpu的内核数量和逻辑处理器数量有关 当线程数与逻辑处理器的数量相同时效率最佳 并非线程越多效率越高
线程的创建线程:
UI线程(主线程):单线程的执行环境,所有的UI控件都必须在主线程上创建和更新,否则会引发跨线程访问的异常(不运行耗时长的任务)
非UI线程(工作线程):处理一些非UI相关的 ...
Windows7 --文件加密
Windows文件加密创建进程
添加进行加密的进程
WORK:
1234567891011int main(int argc,char** argv){ getchar(); //判断 if (argc < 2) { return 0; } char* pFilePath = argv[1];//文件路径}
用命令行参数传入文件路径
12345678910111213141516171819202122232425262728293031void CEncriyptUIDlg::OnBnClickedEncrypt(){ // TODO: 在此添加控件通知处理程序代码 //获取文件路径 CString strFilePath; GetDlgItemText(EDT_FILEPATH, strFilePath); if (strFilePath.IsEmpty()) { AfxMessageBox("路径不能为空"); return; } ...