汇编语言基础

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的空间存放中断向量表

  1. 中断产生:
    pushf
    TF=0,IF=0
    push CS
    push IP
  2. iret指令功能
    pop IP
    pop CS
    popf

端口的读写in 和out、

  1. 访问内存
    in al,60h;从60号端口读入一个字节
    out 20h,al;往20h端口写入一个字节