程序的进入与退出
程序进入在c++中,程序的入口是main函数,并且main函数有两个参数
int main(int argc,char* argv[])
argc是用来记录输入的参数的数量,而argv是用来记录输入的参数。
例如: ls -la,这个输入中有两个参数,第一个参数是ls,第二个参数是-la
程序退出return 是退出当前函数,例如退出主函数或者退出任意函数
而 exit 是退出当前进程,也就是说就算是在调用的函数中,这个程序也会直接结束
exit(0)表示正常退出,exit(1)表示异常退出,更深入的内容涉及到进程。
exit函数在stdlib.h头文件中
深度优先搜索和广度优先搜索
深度优先搜索基本思想:它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念
例
V0->V1->V4->V3->V5->V6,先从v0到V1,再从V1到V4,发现到了终点,就退回到V1继续寻找
代码
注意恢复初始状态十分重要,在一种情况走不了的情况下它可以使其恢复初始状态试下一条路
例题:
遍历连通图,能否从v0到v6
答案
说明,重要的便是模板,先判断当前情况是否满足,如果满足则退出,不满足则遍历所有情况,如果某一位置到了头便会返回false,然后返回到分叉点,搜索下一步(遍历作用在这),而最后一定要回到初始状态,因为别的搜索也可能用
广度优先搜索广度优先搜索是最简便的图的搜索算法之一,别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中
模板
说明:从某一个起始节点开始,看是否 ...
神奇的逗号运算符
cout<<(a,c),此时只会输出c的内容,但是a中的内容也会被计算,例如a=5,b=6,c=7 cout<<((d=a+b),c) 输出为7,d=11
程序执行过程的跟踪
运用debug +程序名进入debug过程
例如 debug 1.exe
程序开始都是从0000的偏移地址开始的,设段地址为A,而程序开始有一段不做该程序内容,而有其他用途。这段程序占256个字节,叫psp,之后段地址偏移10h,所以真正的程序是从A+10:0 开始的(256个字节在16进制中是10,而A也是用16进制表示的)
汇编的第一个程序
伪指令编译器中,包含两种指令,一种是汇编指令,一种是伪指令。伪指令是给编译器看的,最终不会被cpu执行。先了解三个最为基础的伪指令
XXX segment,XXX ends,这两个是配套使用的。功能是定义一个代码段,一个段必须要有一个名称标识(XXX是也)
例如codesg segment ,codesg ends
assume
这条指令作用是假设某一寄存器和程序中的某一个用segment和ends定义的段相关联,写在最开头。
end
没什么特别的,程序的结束标识,不写程序不知道在哪里结束
一个程序assume cs: codesg
codesg segment
mov ax,0123
mov bx,0456
add ax,bx
mov ax,4c00
int 21
codesg ends
end
程序返回在单任务操作系统上,一次只可以执行一个程序,那么当我们写的这个程序执行完之后,还要把cpu控制权交给dos,而mov ax,4c00 和 int 21 就是做这个工作的
汇编语言数据位置的表达
立即数其实就是idata,这种数据执行前在cpu的指令缓冲器中,在汇编指令中直接给出
寄存器指令要处理的数据在寄存器中,在汇编指令中给出相应寄存器名
段地址(SA)和偏移地址(EA)这些数据在内存中,在汇编指令中可以用[x]的方式给出
指令要处理数据有多长用寄存器的ax或al可以很方便的说明数据长度,但是如果是内存之间的传递可以用x ptr 的方式确定是字型传递还是字节性传递
例: mov word ptr ds:[0],1
mov byte ptr ds:[0],1
另外,push操作无需指明,因为push只对字进行操作
结构体的汇编表达一般来说,我们可以用[bx+idata+si]的方式来表达结构体中的数据,用bx定位整个结构体,用idata定义某一个数据项,用si确定数据项中的一个元素
可以简写为 [bx].idata,[bx].idata[si]
汇编语言写函数
例,计算data段第一行的三次方,并储存到第二行上assume cs:code,ds:datadata segment dw 1,2,3,4,5,6,7,8 dd 8 dup (0)data endscode segmentstart: mov ax,data mov ds,ax mov si,0 mov di,16 s: mov bx,[si] call cube mov [di],ax mov [di].2,dx ;这个的含义是[di]的第二个字节 add si,2 add di,4 loop s mov ax,4c00h int 21hcube: mov ax,bx mul bx mul bx ret code ends end start 这个程序函数是cube,注意想要跳转就用call,想要返回就用ret。这时返回值存在ax和dx中,参数在bx中,可如果有多个参数,寄存器不够时,可以用栈来传递参数
用栈传递参数 例:计算(a-b)^3,a,b为字型数据 参数 进入子 ...
汇编中的多层循环
因为唯一的用于统计循环次数的寄存器就是cx,所以有多层循环的时候就会碰到循环次数难以记录的问题,以下是一种解决办法s0:mov dx,cx//用另一个寄存器来存cx的次数 mov si,0 mov cx,3 s:mov al,[si+bx] and al,11011111b mov [si+bx],al inc si loop s add bx,16 mov cx,dx//这里把cx次数取出来减一次 loop s0
但是寄存器的数量是有限的,如果多次循环可能会导致寄存器不够用,因此可以先在数据段定义一个字型数据,然后直接把循环次数放到里面 data segment dw 0 data ends code segmentstart: mov ax,data mov ds,ax mov cx,3 s0: mov ds:[0],cx mov cx,2 s: loop s mov cx,ds:[0] loop s0 此外,还可以定义一个栈,直接用push,pop命令把cx值取出存入
汇编指令学习(待补充)
mov 内存地址1:内存地址2。把地址上的数据从2赋值到1
sub 。。。 数据1-数据2
add 。。。 +
inc 寄存器 让寄存器上的数据+1
dw “define word” 定义字型数据
and 逻辑与命令,按位进行与运算 可以通过该命令将相应为变为0,其他位不变
例如:
mov al,01100011b
and al,00111011b
执行后al=00100011b
or 按位进行或运算 前面一个例子,如果是or的话为01111011b,可以通过该命令将相应位变为1,其他为不变
db,字符型数据
ptr word ptr,byte ptr ,确定是什么数据
div 除法指令,被除数要比除数多8位,如果除数为8位,被除数为16位,除数为16位,被除数为32位,被除数可以用dx和ax存放
如果除数为8位,则用al储存商,ah储存余数,如果除数为16位,则用ax储存商,dx储存余数
例: div bl 这个就是除数为8位,默认被除数是ax
div bx 这个除数是16位,则要用dx和ax两个寄存器 ...
文件输入输出
文件输入in文件输入指的是从文件输入给程序,对应的有in,get,read,seekg等
seekg和seekp中有三个定位基址,分别是cur(当前)beg(开始),end(末尾)<p>例如 seekg(100,ios::beg);seekg(2*sizeof(Student)) student是一个类
文件输出out文件输出指的是从程序输出给文件,对应的有out,put,write,seekp等