汇编语言基础
CS:IP
CS为指令段的段寄存器,用来存放段地址,IP是偏移地址。如下,直接将code段的第一条作为程序执行的第一条代码。
assume cs:code
code segment
......
......
code ends
end
补充:
在链接器中,我们有时不要assume …而是使用链接器脚本,说明如下。
ENTRY(SYMBOL) :将符号SYMBOL的值设置成入口地址。
入口地址(entry point)是指进程执行的第一条用户空间的指令在进程地址空间的地址
ld有多种方法设置进程入口地址, 按一下顺序: (编号越前, 优先级越高)
1, ld命令行的-e选项
2, 连接脚本的ENTRY(SYMBOL)命令
3, 如果定义了start符号, 使用start符号值
4, 如果存在.text section, 使用.text section的第一字节的位置值
5, 使用值0
DS
DS为数据段的段寄存器,当进行数据操作寻址的时候,就将DS中的值作为段寄存器。
mov ax, [0] :0位偏移地址,这时候的数据段的段地址就是DS中的数值。
SS:SP
SS:SP为栈地址,SS为栈段地址,SP为偏移地址
ES
扩展段寄存器,例如在读取磁盘文件到内存中时,es就指向要写入的地址段。
loop循环
循环某段指令n次,n为cx寄存器中的数值。
assume cs:code
code segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
汇编语言中,标号代表一个地址,上述程序中有一个标号s。它实际上标识了一个地址,这个地址只有一条指令:add ax,ax
上面的程序就是将0123H,0456H等8个数据存在以cs:0为起始的内存空间里。
段前缀
mov ax,ds:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
mov ax,cs:[bx]
以上就是将内存中的数据传入ax寄存器中。将段寄存器作为操作数。
数据,代码,栈放入不同的段
声明一个段名,段名可以作为段地址来使用,如下:
mov ax,stack #将栈的段地址移入ax寄存器。
mov ss,ax #设置栈顶。
mov ax,data #将数据段的段地址移入ax寄存器。
mov ds,ax #设置数据段。
offset 取得编号的偏移地址
start : mov ax,offset start
相当于mov ax,0,start的偏移地址为0.
中断
内存0000:0000-0000:03e8约1K的空间存放中断向量表
- 中断产生:
pushf
TF=0,IF=0
push CS
push IP - iret指令功能
pop IP
pop CS
popf
端口的读写in 和out、
- 访问内存
in al,60h;从60号端口读入一个字节
out 20h,al;往20h端口写入一个字节