我学习汇编的笔记,先转上来!分享给大家,可能有错误!
cs段(指令)寄存器存放段地址 IP存放偏移地址debug 命令
(1)-r 查看、改变CPU寄存器内容
(2)-d 查看内存中的内容
格式: -d 1000:0000 a (指定范围查看)
-d 1000:0000 (指定开始位置查看)
(3)-e 改写内存中的内容
格式: -e 起始地址 数据 数据 数据 ········
-e 1000:0000 a (指定范围逐个修改)
-e 1000:0000 'a' 'b' 'c' (从某点开始写入字符)
(4)-t 执行cs:ip当前指向内存地址的命令
(5)-u 段地址:偏移地址 (查看机器指令对应的汇编命令)
(6)-a 段地址:偏移地址 (指定开始位置,将汇编命令写入内存)
mov 命令
mov的几种形式
mov ax,0 寄存器←数据
mov ax,bx 寄存器←→寄存器
mov ax,ds: 寄存器←→内存单元
mov ds,ax 段寄存器←→寄存器
mov ds,ds: 段寄存器←→内存单元
mov byte ptr ds:,0内存单元←数据
push(入栈)、pop(出栈) 命令
ss:sp指向栈顶元素,后进先出
push 先将sp减2,写入数据
pop先读取数据,sp加2
格式:
push(pop) 寄存器
push(pop) 内存单元
存放数据 内存中逆序存放:
dd 12345678h,双字型数据32位→78 56 34 12
dw 1234h, 字型数据16位→34 12
db 12h, 字节型数据 8位→12
add,sub(加,减)
add ax,0 寄存器←数据
add ax,bx 寄存器←→寄存器
add ax,ds: 寄存器←→内存单元
SI和DI两个寄存器功能类似bx(基址寄存器)
但不能分为两个8位寄存器使用
bp:因为不能以的形式寻址,用bp做为过渡
mov bp,sp
mov xx,
用bp+si、bp+di寻址是可以的
使用时如果不明确指示出段地址则默认为ss:
在没有寄存器空闲的情况下的操作命令:
mov ds:,1
inc word ptr
dec byte ptr ds:
add dword ptr
sub
div(除)
除数为8位时,被除数为16位放在ax中,计算结果al存放商,ah存放余数.
除数位16位时,被除数位32位(dx高16,ax低16),计算结果ax存放商
dx存放余数.
offset 标号(位指令,获得标号处的偏移地址)
如mov ax,offset s
mov ax,offset start
mov word ptr ds:,offset start
jmp (无条件转移指令)
1.jmp short 标号 (转移到标号处执行指令) 8位
段内短转移,对IP的修改范围为-128~127
2.jmp near ptr 标号
段内近转移,16位位移=标号地址-jmp指令后的首字节
位移范围为-32768~32767
具体位移量由编译器算出
3.jmp far ptr 标号(操作:cs=标号处段地址 ip=标号所在偏移地址)
段间转移(远转移)
4.jmp 16位寄存器 (ip=16位寄存器)
5.jmp word ptr 内存单元地址(段内转移)
写法:jmp word ptr ds:
jmp word ptr ds:
6.jmp dword ptr 内存单元地址(段间转移)
cs=内存单元地址+2(高位为段地址)
ip=内存单元地址
jcxz (有条件转移指令,所有的有条件转移指令都是短转移,在对应的
机器码中包含转移的位移,而不是目的地址,对ip的修改范围都为:
-128~127)
格式:jcxz 标号(如果cx=0,转移到标号处执行)
操作:当cx=0时,ip=ip+8位位移
8位位移=“标号”处的地址-jcxz指令后第一个字节地址
loop (循环指令,所有的循环指令都是短转移,在对应的机器码中
包含转移的位移,而不是目的地址,对IP的修改范围-128~127)
操作:(1) cx=cx-1
(2) 如果cx不等于0,ip=ip+8位位移
ascii码
大写字母第五位为0 小写为1
A 41H 01000001 a 61H 01100001
543210 ↑
大写A+20H=小写a
and设0 or设1
80*25彩色字符模式显示缓冲区
内存地址空间中:B8000H~BFFFFH共32KB的空间
向这个地址空间写入数据,写入的内容将立即出现在显示器上,
该模式下显示器可以显示25行,每行80个字符。
每个字符占2个字节,高位字节为字符属性,低位为ascii码
内存中:
低8 高8
41 02
ascii 7 6 5 4 3 2 1 0
闪烁r g b 高亮r g b
背景 前景000黑111白
ret (用栈中的数据修改IP,实现近转移)
操作: 出栈并用出栈的数据修改IP (pop ip)
retf (用栈中的数据修改CS和IP,实现远转移)
操作: 出栈2次 先修改IP再修改CS(pop ip,pop cs)
call (先将当前的IP或CS压入栈中,然后转移,此命令不能实现近转移) 注意::::call指令执行时是把call xx下一条代码首字节的偏移地址压栈
call 标号 (将当前的IP压栈后,转到标号处执行)
此命令位移为16位 范围-32768~32767
call far 标号(1 push cs,2 push ip,3 转移到标号处cs:ip)
call 16位寄存器 (1 push ip,2 jmp 16位寄存器)
call word ptr 内存单元地址 (1 push ip,2 jmp word ptr 内存单元地址)
call dword ptr 内存单元地址 (1 push cs,2 push ip,3 jmp dword ptr 内存单元地址)
mul乘法
1.两个相乘的数,要么都是8位,要么都是16位
如果是8位,一个默认放在AH中,另一个放在8位寄存器或内存单元中
如果16位,一个默认放在AX中另一个放在16位寄存器或内存字单元中
2.结果 8位结果默认放在AX中;16位高位存放在DX 低位存放在AX
标志寄存器
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
OF DF IF TF SF ZF AF PF CF
06位 ZF(零标志)
运算指令的结果,如果为0则ZF=1,不为0则ZF=0
02位 PF(奇偶标志)
相关指令执行后,结果中所有二进制位中1的个数如果为偶数则PF=1
如果为奇数则PF=0 (全为0也算偶数)
07位 SF(符号标志)
相关指令执行后,结果为负则SF=1,非负则SF=0
(结果为0也算非负)
00位 CF(进位标志) 针对无符号运算
借了就1 没借就0 进位看假象更高位的具体数字
11位 OF(溢出标志) 针对有符号运算
溢出1 没溢出0
adc(带进位加法指令)
可以利用CF中记录的进位值进行任意位数的加法运算
adc ax,dx ax=ax+dx+cf
sbb(带进位减法指令)
可以利用CF中记录的借位值进行任意位数的减法运算
sbb ax,bx ax=ax-bx-cf
cmp(比较指令) 呵呵,看来楼住学进去了啊,这是学破解基本中的基本要学的汇编指令 看看学习下:$qqq 2# tianlong11
别提了,偶是被论坛里的某个人带的,硬说写外挂多好多好。
结果到CE找偏移 OD调试时候就看不懂了``
才纠着眉毛跟他后面学汇编的`
到现在还是不懂````5555555555555
谁教我的呀``` 写外挂的?呵呵我还真没玩过,不过你好好看看任何一本关于汇编的书就应该会了吧?想写挂不会汇编肯定不行的! 4# 悠悠
这种思想要不得....
学习是因爱好而学,如果不喜欢汇编,硬学只会是枯燥~! 。。。还是很难得。。貌似计算机系的估计好学点。。 谢谢楼主,我也想学的,参考一下.!!!!!!! 谢谢分享 你学的好像不是win32的汇编吧~
页:
[1]
2