pair
pair实际上是一个结构体,它可以把两种类型结合起来使用,定义在<utility>中
定义:pair<类型A,类型B> 标识符
操作 pa.first 表示类型A pa.second 表示类型B
注意不能用-> 操作符,虽然我也不知道为什么
prioity_queue
prioity_queue实际上是一个大顶堆,定义在<queue>中
prioity_queue<int> qu为大顶堆
priority_queue<int,vector<int>,greater<int> > qu;为小顶堆
.push()
.pop()取出元素,但不返回值
.top()不取出元素,返回值
ret 和 retf
retret指令用栈中的数据,修改ip中的内容,从而实现近转移
过程:
ip=ss*16+sp
sp+=2
相当于 pop ip
retf修改cs和ip 的内容,实现远转移过程
ip=ss*16+sp
sp+=2
cs=ss*16+sp
sp+=2
相当于 pop ip ,pop cs
例assume cs:code,ss:stackstack segment db 16 dup (0)stack endscode segment mov ax,4c00h int 21hstart:mov ax,stack mov ss,ax mov sp,16 mov ax,0 push ax mov bx,0 retcode endsend start这条指令相当于把ip变为0,指向第一条指令
qsort
自带的快排函数
qsortvoid qsort(void base, size_t nitems, size_t size, int (compar)(const void , const void))
参数
base— 指向要排序的数组的第一个元素的指针。nitems— 由 base 指向的数组中元素的个数。size— 数组中每个元素的大小,以字节为单位。compar— 用来比较两个元素的函数,即函数指针(回调函数)
回调函数:
回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。 [2]compar参数compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void 型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void 型。在compar函数内部会将const void 型转换成实际类型。int compar(const void p1, const ...
next主题出现404的一个解决方法
在主题配置文件中
menu:home: /|| homeabout: /about/|| usertags: /tags/|| tagscategories: /categories/|| tharchives: /archives/|| archive#schedule: /schedule/|| calendar#sitemap: /sitemap.xml || sitemap#commonweal: /404/|| heartbeat
注意/||,原来是/ ||,不要中间那个空格,亲测有效
memset
memset(标识符,填充数据,大小)
memset是一个字节一个字节填充的,所以一般只能填充0或-1因为这个一个字节和四个字节相同
mul指令
两个相乘的数:
如果是8位,那么一个默认在al中,另一个在8位寄存器或内存字节单元中,如果是16位,一个在ax中,另一个在16位寄存器或内存字单元中
结果: 如果是8位,结果默认在ax中,如果是16位,高位默认在dx中,低位在ax中
jmp进行跳转
根据位移进行的转移用jmp进行跳转时,会发现一个奇怪的问题,无论它要跳转到哪里,它的机器码始终不变,为EB03,那么它到底是怎么告诉cpu修改ip地址的呢?
先回忆一下cpu读取指令的过程
cs=076a ip=0006,cs:ip指向eb03
读取指令码eb03到指令缓冲器
ip=ip+指令长度=0008h,cs:ip指向下一条指令
cpu执行指令缓冲器中的指令eb03
执行完缓冲器中的指令后,ip被修改+
jmp指令并不需要转移的目的地址,但是它是凭借什么转移的呢?这里有个03,正好跳过三个字节之后就是要转移的地址。原来jmp指令只需知道当前指令的下一个指令(因为执行完这条指令后ip会增加)与要跳转的指令的位移就可以了
jmp short 标号 功能是 ip=ip+8位位移(一字节)
jmp near ptr 标号 是16位
jmp far ptr 标号 是段间转移,可以修改cs
还可以直接 jmp 寄存器1:寄存器2
根据内存进行的转移转移地址再内存中的转移有两种格式
jmp word ptr(段内转移)
例 jmp word ptr ds:[0]
jmp word p ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post$ hexo new "My New Post"
More info: Writing
Run server$ hexo server
More info: Server
Generate static files$ hexo generate
More info: Generating
Deploy to remote sites$ hexo deploy
More info: Deployment
int指令
格式: int n,n为中断类型码
在程序中可以采用int指令调用任何一个中断处理程序
例如: int 0 ,就会调用除法溢出的处理程序
所以说,int指令最终的功能与call指令类似,都是调用一段程序
例 用中断程序实现循环
要想实现循环,需要知道两个量,第一个是循环次数,第二个是跳转位移。循环次数用cx来保存,跳转位移用bx来保存
而为了实现loop指令,中断例程需要实现两个功能
dec cx
cx=0,则顺序执行,否则,跳转
代码 ...安装 mov bx,offset s-offset se mov cx,80 s: mov byte ptr es:[di],'!' add di,2 int 7ch;这时ip指向下一条指令即se标号se: noplp: push bp mov bp,sp dec cx ;cx-- jcxz lpret add [bp+2],bx//因为入栈顺序为标志寄存器,cs,ip,而add是与后两个字节addipret: pop bp iret //没到cx=0时也会终止,但这时ip就不会回 ...