Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36065
  • 博文数量: 17
  • 博客积分: 608
  • 博客等级: 中士
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-07 00:56
文章分类
文章存档

2012年(17)

我的朋友

分类: 虚拟化

2012-07-07 01:13:07


符号表示:

SRC      源操作数。内存的内容或地址

DST     
目的操作数。
内存的内容或地址

NOT     
对源操作数是否取反的位。   


BU    
—— 位容器


BU32F 
—— 单精度浮点数


BU64F 
—— 双精度浮点数


BU8S  
—— 带符号8位字节B整型


BU8   
—— 无符号8位字节B整型


BU16S 
—— 带符号16位半字Z整型


BU16  
—— 无符号16位半字Z整型/字符型


BU32S 
—— 带符号32位字W整型


BU32  
—— 无符号32位字W整型


BU64S 
—— 带符号64位整型


BU64  
—— 无符号64位整型


BU64
K  —— 64
位图

BU64
KZ —— 一个单元或簇,128KB

32位汇编指令格式:

标号;
 
操作符(目的操作数,源操作数,参数1,参数2,模式参数;// 注释。

   标号是可选的,如果有,它必须顶格写。标号的作用是让汇编器来计算程序转移的地址。

A汇编语言有二大类(水色、金色),五种指令格式,27条基本指令。

应用程序被限制在一个单元(32K字)内。估计相当于LINUXWINDOWS操作系统功能的代码量不到4K字,而不会象WINDOWS的以GB为单位。4K字,4K行的代码也是非常难的事啊;3万行的代码应能搞定一切软件。超强的指令集已经内含了SQL指令集,字符串指令集,并行运算指令集,位管理指令集,流处理指令集,多媒体指令集。虽然指令集是超强的,但基本上只有易于实现的2类指令。

一、水色: 测试与转移指令  

1位测试转移指令:BTBXN( DST目标地址 );
DST目的操作数32位字的5位 位地址,位地址指向的位测试为10 转移, 跳转到标号地址。B-位;T-测试;B-转移; X:位为10跳转;NN测试位取反,无则反之
范例:BTB0N( XX文件.CSS.0X1111.0X17, 17); // 测试XX文件的代码段的0X1111
// 址的字内容的第23位,如为0跳到标号“17行”,并
清该位为0
构造这条指令的目的是:1. 简化硬件实现。
2. 把下面的10多条通用CPU汇编指令合一。就是测试CPU状态寄存器SR字的某位。

        通用CPU指令                              虚拟CPU指令        
JEQ/JZ  标号 零位被置时转移到标号语句    等于时程序跳转   BTB1  Z标号;
JNE/JNZ 标号 零位复位时转移到 标号语句   不等时程序跳转   BTB0  Z标号;
JC/JHS  标号 进位位被置时转移到标号语句  大于或等于时程序跳转 BTB1  C标号;
JNC/JLO 标号 进位位复位时转移到标号语句  小于时程序跳转    BTB0   C标号;
JN      标号 负位被置时转移到标号语句    为负时程序跳转    BTB1   N标号;
JNN     标号 负位被清零时转移到标号语句大于或等于程序跳转 BTB0   N标号;
JV      标号 溢出位被置时转移到标号语句                  BTB1   V标号;
JNV     标号 没有溢出时转移到标号语句                    BTB0   V标号;
JCZ     标号 C置位,Z清零时转移到标号语句 大于时程序跳转    BTB1  CZ标号;
JZC     标号 C清零, Z置位时转移到标号语句小于或等于时程序跳转BTB0  CZ标号;
JL      标号 N.xor.V=1时转移到标号 带符号小于时程序跳转     BTB1  NV标号;
JGE  标号 N.xor.V=0 时转移到标号 带符号大于或等于时程序跳转  BTB0  NV标号;
JGT  标号 Z清零且NV置位,N清零且V清零 带符号大于时程序跳转 BTB1 GT标号;
JLE  标号 Z置位,N置位且V,N零且V置位带符号小于或等于时跳转BTB0 GT标号;
JMP     标号 无条件转移到标号语句                        BTB1  B1标号;

2
查表跳转指令: TBH( DSTSRC );
DST
为入口表地址,也称接口地址。通常有中断入口表、线程/进程入口表、消息入口表等。SRC16位的接口号,通常有中断号,线程号,进程号,消息号。
    
这是一条很有用的指令。使消息处理;进程、线程切换变得容易。我想,中断的实现机制也应是基于这条指令。如果,中断优先机制得到了一个中断优先号->SRC,而DST指向了中断入口表;那么TBH( DST, SRC ); 则使之跳到了相应的中断函数。同理,如果调度子程序得到了一个进程或线程优先号->SRC,而DST指向了进程或线程入口表;那么TBH( DSR, SRC ); 则使之跳到了相应的进程或线程函数。在应用程序中,如果DST指向了我们感兴趣的消息入口表,而消息转换子程序从大量的系统消息中查找我们感兴趣的消息并转换成感兴趣的消息入口表中的对应消息号->SRC,那么TBH( DST,SRC );则使之跳到了相应的消息处理函数。    

3、子程序返回指令:  RET ; // 普通子程序返回。

4调用子程序指令:  CALL( 目标地址 ); 
//
普通子程序调用,系统调用由编译器区分。

5位图搜索指令:    SS1N( DST, SRC, BU16 n );  
    搜索SRC指向的位图左起(从高位起)第一个为1的位索引地址index->DST, 或到达位图尾部结束。n为位图的大小, 单位是位;最大64K位。NN测试1位取反,无则反之
   
这是一条非常有用的高效指令,主用于内存的空间分配、SQL数据库表的记录等对象管理方面。通常使用位图来管理对象。如一个最大有64K项的文件目录系统,会用一个64K位的位图去管理它。一般来说位图的内容是1的表示该位是空闲。如果另一个进程要向文件管理者申请新建一个文件或目录,则文件管理者会用SS1N( DST, SRC, n ); 指令查询位图。如果没有空闲则返回NAK;否则返回索引地址DST,响应ACKCPU的内存最小单位是一个16位半字Z索引地址index的低字是位图的第几个Z,而高字则是16Z4位位地址。以后如要删除这个文件或目录,则根据索引地址把位图中的对应位使用BIS指令置一即可。同样,在256TZ的内存或硬盘空间中,我们划分为64K个域空间(4GZ),使用一个64K位图。而每个域空间使用一个64K位图管理其下的64K个单元。一个进程向对象管理者申请新建一个对象,都会牵涉到对象,空间的分配等。类推,新建一条SQL数据库表的记录等。

6、比较结果为条件T转移指令:CMPTB( DSR,SRC,BU16 len,BU16 n,目标地址 );
 4个条件是: 等于,不等于,大于,小于。
 
SRC=源表的指针,DST=目标表的指针LenDST表的长度。比较SRCDST所指的内存区间n字符(2字节)符合条件转移或到达目标表尾部结束, 每次比较后DST + 2 -> DST;直到符合条件为止。这同样是一条非常有用的高效指令,主用于数据库表的SQL查询,文本的字符串查询,消息查询等。
等效C库函数:                                

bcmp(比较内存内容)

memcmp(比较内存内容)

index(查找字符串中第一个出现的指定字符)

strchr(查找字符串中第一个出现的指定字符)

memchr(在某一内存范围中查找一特定字符)

rindex(查找字符串中最后一个出现的指定字符)

strcasecmp(忽略大小写比较字符串)

strcmp(比较字符串)

strcoll(采用目前区域的字符排列次序来比较字符串)

strcspn(返回字符串中连续不含指定字符串内容的字符数)

strncasecmp(忽略大小写比较字符串)

strpbrk(查找字符串中第一个出现的指定字符)

strrchr(查找字符串中最后出现的指定字符)

strspn(返回字符串中连续不含指定字符串内容的字符数)

strstr(在一字符串中查找指定的字符串)

getutid(从utmp 文件中查找特定的记录)

getutline(从utmp 文件中查找特定的记录)

bsearch(二元搜索)

lfind(线性搜索)

lsearch(线性搜索)


二、金色
: 赋值与传送指令指令:

1 赋值指令:   DST = SRC; 
注意:执行会强制为DST的类型,而不管SRC的类型。

2 传送指令:  MOV( DST, SRC, BU16 mode, BU16 n );
MOV用来以模式mode(不一定有) 拷贝SRC 所指的内存内容前n个字节到DST所指的地址。

等效C库函数:
bcopy(拷贝内存内容)
memccpy(拷贝内存内容)
bzero(将一段内存内容全清为零)
memcpy
(拷贝内存内容)
memmove
(拷贝内存内容)
memset(将一段内存空间填入某值)
strcpy(拷贝字符串)
strdup(复制字符串)
strncpy(拷贝字符串)
fgetgrent(从指定的文件来读取组格式)
fgetpwent(从指定的文件来读取密码格式)
getegid(取得有效的组识别码)
geteuid(取得有效的用户识别码)
getgid(取得真实的组识别码)
getgrent(从组文件中取得账号的数据)
getgrgid(从组文件中取得指定gid 的数据)
getgrnam(从组文件中取得指定组的数据)
getgroups(取得组代码)
getpw
(取得指定用户的密码文件数据)
getpwent(从密码文件中取得账号的数据)

getpwnam(从密码文件中取得指定账号的数据)
getpwuid(从密码文件中取得指定uid 的数据)
getuid(取得真实的用户识别码)
getutent(从utmp 文件中取得账号登录数据)
initgroups(初始化组清单)
pututline(将utmp 记录写入文件)
seteuid(设置有效的用户识别码)
setfsgid(设置文件系统的组识别码)
setfsuid(设置文件系统的用户识别码)
setgid(设置真实的组识别码)
setgroups(设置组代码)
setpwent(从头读取密码文件中的账号数据)
setregid(设置真实及有效的组识别码)
setreuid(设置真实及有效的用户识别码)
setuid(设置真实的用户识别码)
setutent(从头读取utmp 文件中的登录数据)
utmpname(设置utmp 文件路径)
dup2(复制文件描述词)
fcntl(文件描述词操作)
lseek(移动文件的读写位置)
read(由已打开的文件读取数据)
write(将数据写入已打开的文件内)
clearerr(清除文件流的错误旗标)
fdopen(将文件描述词转为文件指针)
fgetc(由文件中读取一个字符)
fgets(由文件中读取一字符串)
fileno(返回文件流所使用的文件描述词)
fputc(将一指定字符写入文件流中)
fputs(将一指定的字符串写入文件内)
fread(从文件流读取数据)
fseek(移动文件流的读写位置)
ftell(取得文件流的读取位置)
fwrite(将数据写至文件流)
getc(由文件中读取一个字符)
getchar(由标准输入设备内读进一字符)
gets(由标准输入设备内读进一字符串)
putc将一指定字符写入文件中
putchar(将指定的字符写到标准输出设备)
rewind(重设文件流的读写位置为文件开头)
setbuf(设置文件流的缓冲区)
setbuffer(设置文件流的缓冲区)
setlinebuf(设置文件流为线性缓冲区)
setvbuf(设置文件流的缓冲区)
ungetc(将指定字符写回文件流中)
atexit(设置程序正常结束前调用的函数)
getpgid(取得进程组识别码)
getpgrp(取得进程组识别码)
getpid(取得进程识别码)
getppid(取得父进程的进程识别码)
getpriority(取得程序进程执行优先权)
nice(改变进程优先顺序)
setpgid(设置进程组识别码)
setpgrp(设置进程组识别码)
setpriority(设置程序进程执行优先权)
chdir(改变当前的工作目录)
chmod(改变文件的权限)
chown(改变文件的所有者)
chroot(改变根目录)
fchdir(改变当前的工作目录)
fchmod(改变文件的权限)
fchown(改变文件的所有者)
fstat(由文件描述词取得文件状态)
ftruncate(改变文件大小)
getcwd(取得当前的工作目录)
lstat(由文件描述词取得文件状态)
readdir(读取目录)
readlink(取得符号连接所指的文件)
rename(更改文件名称或位置)
rewinddir(重设读取目录的位置为开头位置)
seekdir(设置下回读取目录的位置)
stat(取得文件状态)
telldir(取得目录流的读取位置)
truncate改变文件大小)
umask(设置建立新文件时的权限遮罩)
utime(修改文件的存取时间和更改时间)
utimes(修改文件的存取时间和更改时间)
ferror(检查文件流是否有错误发生)
perror(打印出错误原因信息字符串)
strerror(返回错误原因的描述字符串)
getenv(取得环境变量内容)
putenv(改变或增加环境变量)
setenv(改变或增加环境变量)
getsockopt(取得socket 状态)
setsockopt(设置socket 状态)
sendto(经socket 传送数据)
sendmsg(经socket 传送数据)
send(经socket 传送数据)
recvmsg(经socket 接收数据)
recvfrom(经socket 接收数据)
recv(经socket 接收数据)

到此我们构建了8
条汇编指令,可用来编写类同UNIX,  LINIX,  WINDOWS的操作系统了

阅读(903) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~