基础
mov
1 | mov ax,b //寄存器,数据 |
add sub
1 | add/sub ax,8H |
add ds,ax;错误,不能直接操作ds(数据段寄存器)
累加数据段中前三个字型数据
将123B0H~123BAH的内存单元定义为数据段
1 | mov ax,123BH |
一个字型为两个字节型
栈
寄存器CS和IP中存放着当前指令的段地址和偏移地址
同样 有段寄存器SS 用来存放栈顶的段地址
寄存器SP 存放栈顶的偏移地址
则:SS:SP 指向栈顶元素
PUSH POP
1 | push ax |
以字为单元进行
则PUSH在存放数据时 SP先减二再取数据
POP 先拿数据再SP加二
没有溢出、出界检测
使用 sub ax,ax较mov ax,0进行清零操作更短(两个字节、三个字节)
1 | mov ax,1000H |
开写
参考Win10(64位)安装汇编环境(MASM)
配置一下这个“DOSBox 0.74 Options.bat”最后
1 | [autoexec] |
然后
masm name.asm; (加分号!)
link name.obj;
name.exe
debug使用
- r(register)寄存器操作
- 只输入“r”来显示寄存器内容
- “r ax”再输入值,可指定改变某个1寄存器值
- d(dump)查看内存中的信息
- 用“d 段地址:段偏移地址”显示从指定内存单元开始的128个单元的内容
- 接着使用“d”命令,可列出后续的内容
- 查看指定范围,用“d 段起始地址:起始偏移地址 结尾偏移地址”
1
d 1000:0 9
- e(edit)改写内存中的内容
- 用“e 起始地址(段地址:段偏移地址) 数据 数据…”来修改从起始地址开始的内存中的内容
- 也可以用e命令以提问的方式来逐个地修改从某一地址开始的内存单元中的内容,以从1000:10单元开始为例,步骤如下:
- 输入e 1000:10,按enter键
- debug显示起始地址1000:0010,和第一个单元的原始内容:00,然后光标停在“.”后面提示输入想要写入的数据,此时有两种选择:一是输入数据,然后按空格键,即输入数据修改当前的内存单元;二位不输入数据,直接按空格键,则不对当前内存单元进行改写。
- 当前单元处理完后(不论改写或者没有改写,只要按了空格键,就表示处理完成),debug将显示下一个内存单元的原始内容,并提示修改。
- 所以希望改写的内存单元改写完成后,按enter键,e命令操作结束。
- u(un-assembly)反汇编机器码
- “u 段起始地址:起始偏移地址 结尾偏移地址 ”
- t(trace)单步调试命令
- 老规矩,一步一步走
- a(assembly)以汇编指令形式写指令到内存中
- 代替e命令的机器码指令,直接用汇编码写入
- p执行汇编程序,单步跟踪。
- 执行 int 21
- t p区别
- 单步跟踪命令(单步进入(step in)):t命令是单步执行,是真的单步执行,碰到任何地方,都会一步步执行,遇到子程序,也会进入里面一步步执行再返回
- 单步执行命令(单步通过(step over)):p命令,大多数情况与t一样,只有当遇到call调用子程序的时候,p命令直接执行完这个程序,而t命令会进入里面一步步执行。
- 结束debug一般”p”+”q”+”exit”
- g执行汇编指令
- 使用方法是:g [=起始地址] [断点地址],从起始地址开始执行到断点地址。如果不设置断点,则程序一直运行到中止指令停止;如果不设置起始地址,则会向下运行到断点地址