第4章(第一个程序):
用到的工具:MASM.exe LINK.exe
伪指令:编译器处理
例:
assume cs:codesg(定义一个代码段名称)
codesg segment(代码段)
start: 汇编语句
codesg ends(配合结束)
end
assum假设关联
start :入口(可以自己命名)
编译->可执行文件(pe)
int 中断
结束:
程序返回:mov ax,4c00 int 21
段结束:ends
程序结束:end
加分号可以不用设置过程
编译:masm 文件名(加分号可跳过中间过程)
连接:link 文件名(obj文件,加分号可跳过中间过程)
简单方法:ml 文件名(编译并连接)(要有ml.exe)
psp:存放dos和程序交互命令100H,ds偏移psp后是cs:ip
另:1.dos是单任务操作系统
2.dos修改了CS:IP使程序运行
3.debug装入内存会在cx中存储长度
实际操作遇到的问题:
1.non-digit in number:应当在十六进制数后加H
2.debug默认十六进制。
第5章([bx]和loop循环):
[bx]指令:主要因为在文本编辑和debug中不一样,文本编辑中[常数]相当于常数,所以要先存到bx才表示偏移地址。
():描述符号,表示括号内的内容
idata:描述符号,表示一个常量
loop和cx:loop循环直到cx减为0(通常)
loop语句用法:跳转到s标签循环.(在之前设置s标签(s:代码))
编程考虑过程:是否安全(存放位置)->是否能存下结果->初始化(ds,cx,ss等)->调用循环->结束
段前缀:显式给出段地址(cs: ds: ss:)(ds寄存器的作用可以用es:[ ]替代)
安全空间(底层而不冲突的空间):0:200~0:2ff
另:1.执行循环最好把mov cx ,idata放在要循环的部分前
2.汇编源程序中数据不能以字母开头,在前面加0
3.不同段可以再用一个段寄存器
编程中的问题:
1.loop语句在要循环的语句之后
2.源程序中地址表示形如ds:[idata]
3.注释采用';'
第6章(多个段的程序):
解决的问题:既要有代码又有数据
1.不使用多个段:
例:
assume cs:code
code segment
dw 123ah,34d3H
start:mov ax,cs;设定栈
mov ss,ax
mov sp,0004;偏移地址为dw之和(因为数据从0开始所以直接相当于dw长度和)
mov bx,0
mov ax,4c00h
int 21h
code ends
end start
db :定义字节型数据(8)--->dw:定义字型数据(16)--->dd:定义双字结构(32)
既可以用来设置内存值,又可以用来分配内存。
直接放在代码段,段地址CS,偏移地址在最开始为0
设定start(见前面)入口使cpu区分数据和代码。--->end可以通知入口是谁
2.使用多个段:
assume cs:code,ds:data,ss:stack
data segment
dw 1234h,2334h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack;stack,data,code都是存有段地址的常量
mov ss,ax
mov sp,10h;stack段的dw之和
mov ax,4c00h
int 21h
code ends
end start
另:
1.不同段段地址相差至少1
实验暴露的问题:
1.段地址是10倍
2.loop后面要跟段标签
3.不能直接把段标签拿来用,要放到段寄存器里才能用