第四章 第一个程序
首先回顾一下栈的基础知识:
栈的特点:先入后出
对于8086,其pop、push指令操作如下:
pop:数据出栈,sp+2
push:sp-2,数据入栈
然后回顾一下win32的debug指令:(出于个人习惯,有些步骤不是必要的)
首先进入debug
cd c:\
c\>:debug
指令r:查看、修改寄存器的值,可以操控cs,ip。但是在汇编程序中不可以直接修改ip
r 查看寄存器值
r register_name 修改寄存器值
指令d: 查看内存中的内容
d 段地址:偏移地址 <结尾偏移地址>
结尾偏移地址可以省略,默认显示128个内存单元。如果参数全部缺省,从debug预设地址开始
指令e :改写内存中的内容
e 段地址:偏移地址 内容(字符用引号括起)
指令u:将机器码翻译为汇编代码
u 段地址:偏移地址
指令t:单步执行,从cs:ip地址开始
指令a:以汇编形式向内存中写入汇编指令
a 段地址:偏移地址
4.1 源程序到执行
编写-编译、链接-执行
4.2 程序示例
assume cs:codesg
codesg segment
mov ax,0123h
mov bx,0456h
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends
end
segment ends配套使用,代表段开始、结束
end 代表程序结束
assume:将段同段寄存器关联起来
//代码段、堆栈段、寄存器段等
伪指令编译后成为描述信息。
mov ax,4c00h
int 21h
上述两句实现程序返回的功能。
4.3 源程序的编辑
使用edit
cd c:\
c:\>edit //进入edit
File->save-><路径>file_name.asm//路径可缺省
或者用键盘上下左右键选择到
Directories,按enter进入想保存目录下即可
4.4 编译
cd masm所在路径
masm
我的程序在masm下的demo目录里,编译过程如下,.obj文件名默认,后几个文件未生成。
4.5 连接
obj文件在masm下,demo的建立貌似多此一举,所以可以不建demo文件夹,直接存在masm下就好
4.6 简化方式的编译与连接
masm 文件路径+文件名(无后缀);
link同上
把所有文件直接放在c或者d盘最方便(路径段,容易输入)
4.9 程序执行过程跟踪
debug 路径+文件名
debug加载程序后,cx存放程序的长度。
debug调用时,会创建psp用来和程序通信,psp和程序的物理地址连续,但是段地址不同
用
p
指令执行
int 21h
psp段地址为ds,偏移地址为0
程序执行过程跟踪
debug 路径+文件名
debug加载程序后,cx存放程序的长度。
debug调用时,会创建psp用来和程序通信,psp和程序的物理地址连续,但是段地址不同
用
p
指令执行
int 21h
psp段地址为ds,偏移地址为0