ax //是16位的寄存器,最大可以存65535
ah,al //是8位的寄存器,最大可以存255
cs:ip //指向程序下一条执行的指令
ds //数据段寄存器
ss //栈段寄存器
sp //栈顶指针
物理地址=段地址*16(十进制)+偏移地址
物理地址=段地址*10(十六进制)+偏移地址
物理地址20030 段地址2000 偏移地址30
Debug的常用命令
r //查看和修改寄存器
d //查看内存
e //修改内存
u //反汇编
t //单步执行
a //写汇编指令
g //相当直接运行
p //执行完返回
jmp 2000:0030 //相当于mov cs,2000;mov ip,0030,但不能直接给段寄存器传数据
//计算2的n次方
2000:0000 mov ax,1
2000:0003 add ax,ax
2000:0005 jmp 2000:0003
//查看rom的刷写时间,但是无法修改
-d fff0:0000 ff
//ds段寄存器不能直接传递数据,可以通过寄存器来传递
mov bx,1000
mov ds,bx
mov al,[0]
mov [10],al
//压栈和出栈,一个栈的最大是0-ffffh,64KB
mov ax,1000H
mov ss,ax
mov sp,ffea
push ax //sp减2
push bx //sp减2
pop ax //sp加2
pop bx //sp加2
//
mov bx,0100h
mov ax,[bx] //将0100地址的数据传递给ax
mov [bx],ax //将ax的数据传递给bx指向的地址
mov ax,ds:[0] //MASM32 汇编里的表示
//and指令
mov al,01100011b
and al, 00111011b ;将操作对象的相应位设为0, 其他位不变
结果 00100011b
//or指令
mov al, 01100011b
or al, 00111011b ;将操作对象的相应位设为1,其他位不变
结果 01111011b
// bx=61h, 一个字母, 不管它原来是大写还是小写, 将它的二进制第5位置0, 肯定就是大写字母了, and al, 11011111h
mov al,[bx]
and al,dfh ;转换成大小'A' 41H
mov [bx],al
mov al, [5+bx] ; 指明一个内存单元
si和di寄存器和ax,bx类似, 只是不能拆分为两个8位寄存器
//各种寻址方式
[idata]
[bx]
[bx+idata]
[bx+si]
[bx+si+idata]
只有bx, si, di, bp这四个寄存器可以进行寻址
db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字型数据)
db 3 dup (0)
db 3 dup (0,1,2)
db 3 dup('abc', 'ABC')
dos和其他合法的程序一般不会使用0:200-0:2ff(00200-002ff)这256个字节的空间
待续......
转载请注明:exchen's blog » 学习16位DOS汇编笔记