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
debug和源程序对指令的不同处理
[]debug程序中[0]表示 ds:0处的数据进行处理
而源程序中表示把0这个数据给要处理的数据
例 mov ax,[0]在debug中表示把ds:0处元素给ax,而在源程序中表示把0给ax
在程序中,可以直接使用段寄存器加偏移地址来确定访问的元素,例如:ds:[bx],cs:[bx],ss:[bx]等
dd
dd是用来定义双字型data segment dd 1data ends要注意dd要占两个字,db一个字节,dw一个字
c++输出16进制,10进制和2进制
hex是输出16进制,例如cout<<hex<<18<<endl;
dec十进制
另外这两种用了之后后面输出一直是这种进制,如果用了hex之后想要用十进制要写dec
二进制bitset
bitset有头文件 <bitset>
使用方法 bitset(数字),其中8的含义是要输处几位二进制数,所以如果用int型是32,如果想把字符型转换就直接写8
[bx]和loop
[bx]mov ax,[bx]
这个的意思是把ds:bx处的内容放入ax中
mov [bx],ax
这个的意思是把ax中的内容放入 地址ds:bx处
[bx+idata]实际上还有更加灵活的方式指明内存地址,就是bx后加一个数据,这个数据可以是常数,也可以是变量
例 mov ax,ds:[bx+200],也可以直接写为ds:200[bx]
这种处理方式可以方便的处理数组
loop格式:loop+标识符
执行过程:执行到loop时,先让cx-=1,再判断cx中的值,不为0则转至标号处继续执行,为0则进行下一步操作,寄存器cx用来储存循环次数
例
mov cx,3
mov ax,2
s: add ax,ax
loop s
这段程序的作用是计算2的三次方,首先让循环次数为3,ax=2,再从s处开始循环,当cx=0时退出,即进行3次
用debug跟踪loop指令 tip:汇编程序中,数据不能以字母开头,所以如A231h等等前面都要加一个零
如果想直接结束循环可以用p命令,如果用t命令的话,只会结束这一次循环