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就不会回 ...
df标志和传送指令
flag第十位是df,方向标志位,在串处理指令中,控制每次操作后si,di的增减
df=0,每次操作后都是si,di增
df=1,减
串传送指令movsb格式: movsb
功能:
es16+di=ds16+si
如果df=0,则 si=si+1,di=di+1,等于一相反
汇编语言描述
mov se:[di],byte ptr ds:[si] (汇编不支持这样的指令)
如果df=0 inc si inc di else dec si dec di
movsb的功能是将ds:si中的数据传到 es:di中
movsw格式 movsw
这个是按字来传送,si和di+2或-2
reprep movsb
相当于
s: movsb
loop s
rep的作用是根据cx的值,重复执行后面的串传送指令
df 设置指令cld 指令: 将df设置为0std指令: 将df设置为1
delete的一个注意事项
实际上delete后的指针并不会变成空指针,仍指向堆里的地址。但是这个时候这块空间已经可以被其他的new申请了,如果你没有把原指针更改的话,有可能对原指针进行的修改会影响到新指针。因此每次delete完之后最好把这个指针变成空指针
dup
dup用来处理重复数据
例:db 3 dup (0) 这个意思是定义了三个0的字节型数据
db 3 dup (0,1,2) 定义了九个数据
db 3 dup (‘abc’,’ABC’)定义18个数据
debug
这里列举几个debug的基本命令
r用来查看此时寄存器内的数值和下一步将要执行的命令r 还可以接寄存器,用于修改寄存器内的内容例:r ax 这样会出现ax的内容和一个冒号,然后就可以输入数据修改了
d格式:d 段地址:偏移地址作用:列举出该地址下的机器码例 d 1000:0,这样子将会列举从1000:0 到1000:7f的所有内容
e格式:e 段地址:偏移地址作用:修改改地址下的机器码
t执行cs ip所指向内存地址的命令,直接输入t,不需要输入其他东西
a作用:用汇编语言输入指令到内存上写法: a 段地址:偏移地址例: a 1000:0输出1000:0 (input)mov ax,1然后1000:0 到1000:3 就会输入这条指令了,之后将cs ip地址设置一下,然后用t指令运行
u作用:查看某地址下的汇编程序写法: u 段地址:偏移地址例 u 1000:0然后就会输出1000:0 开始有的汇编指令了
call指令
操作
将当前的ip或cs压入栈中
转移
这里的转移与jmp相同,也有位移和内存两种方式
根据位移call 标号(将ip压入栈中后,转移到标号处进行指令)过程:
sp+=2,ss*16+sp=ip
ip=ip+16位位移
16位位移=标号处地址-call指令后第一个字节的地址
相当于 push ip,jmp near ptr 标号
根据目的地址call far ptr 实现段间转移
操作:
sp-=2
ss16+sp=cs3.sp-=24.ss16+sp=ip
cs=标号所在段地址,ip=;标号所在偏移地址
段内转移一般是根据位移,段间转移一般是根据地址
如果地址在寄存器中, call reg,ip被修改
如果地址在内存中
1 call word ptr 内存地址
这种是段内转移,相当于 push ip,jmp word ptr
2 call dword ptr 内存地址
段间转移 例
call dword ptr ds:[0] ,这样ds:[0]和ds:[1]是ip ,ds:[2]和ds:[3]是cs