置顶随笔

[置顶]我的工具~

posted @ 2009-03-10 20:35 fatkun 阅读(22) 评论(0) 编辑

2009年10月10日

新的博客 fatkun.com

Fatkun的博客 www.fatkun.com

 

另外还有一个可以把JAR合并一起运行的网页fatkun.com/m

posted @ 2009-10-10 13:19 fatkun 阅读(17) 评论(0) 编辑

2009年4月15日

试编写程序,要求从键盘输入3个16进制数,并根据对3个数的比较显示信息

1.试编写程序,要求从键盘输入3个16进制数,并根据对3个数的比较显示如下信息:

 (1)如果3个数都不相等则显示0; (2)如果3个数中有2个数相等则显示2; (3)如果3个数都相等则显示3。

data segment
array dw 3 dup(?)
data  ends

code  segment
main  proc far
 assume cs:code,ds:data
start:
push ds
sub  ax,ax
push ax
mov  ax,data
mov  ds,ax
mov  cx,3
lea  si,array
begin:
 push cx
 mov  cl,4
 mov  di,4
 mov  dl, ' '
 mov  ah,02
 int  21h
 mov  dx,0
input:
mov  ah,01
int  21h
and  al,0fh
shl  dx,cl
or  dl,al
dec  di
jne  input
mov  [si],dx
add  si,2
pop  cx
loop  begin
comp:
 lea  si,array
 mov  dl,0
 mov  ax,[si]
 mov  bx,[si+2]
 cmp  ax,bx
 jne  next1
 add  dl,2
next1:
 cmp  [si+4],ax
 jne  next2
 add  dx,2
next2:
 cmp  [si+4],bx
 jne  num
 add  dl,2
num:
 cmp  dx,3
 jl  disp
 mov  dl,3
disp:
 mov  ah,2
 add  dl,30h
 int  21h
 ret
main  endp
code ends
  end  start

posted @ 2009-04-15 15:39 fatkun 阅读(160) 评论(0) 编辑

例1.编写程序,求 (X+Y)(X-Y)/Z,设X,Y均为一个8位无符号数,运算不考虑溢出

1.编写程序,求 (X+Y)(X-Y)/Z,设XY均为一个8位无符号数,运算不考虑溢出。

 

DSEG SEGMENT
DATX DB 10   ;假定X为80
DATY DB 5   ;定义主Y的值
DATZ DB 5   ;定义Z的值
DATW DB ?   ;定义保存计算结果的存储单元
DSEG ENDS

STEG SEGMENT PAPA 'STACK'
DW 20H DUP(0)
STEG ENDS

CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:STEG
BEGIN:MOV AX,DSEG
     MOV DS,AX
     MOV AL,DATX ;取X
     ADD AL,DATY ;计算(X+Y)→(AL)
     MOV BL,DATX ;取X
     SUB BL,DATY ;计算(X-Y)→(BL)
          MUL BL  ;计算(X+Y)(X-Y)→(AX)
     MOV CL,DATZ ;取Z
     DIV CL   ;计算(X+Y)(X-Y)/Z
     MOV DATW,AL ;保存结果
     MOV AH,4CH  ;返回DOS
     INT 21H
CSEG ENDS
   END BEGIN

posted @ 2009-04-15 15:35 fatkun 阅读(159) 评论(0) 编辑

例2.编定汇编程序,实现符号函数(设-128≤X≤127)

2.编定汇编程序,实现符号函数(设-128≤X≤127)。

分析:变量X的符号函数可表示为

程序可通过对符号标志的判别来确定执行哪一分支。

 

DATA SEGMENT 
X DB -68   
Y DB ?   
DATA ENDS

STACK SEGMENT PAPA 'STACK'
DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STEG ; 段地址说明
START:MOV AX,DATA
     MOV DS,AX  ;数据段地址装填(堆栈段地址由系统装填)
     MOV AL,X 
     CMP AL,0 ;和0比较
     JGE  LOP1 ;高于等于0时转移
     MOV Y,0FFH ;否则设为-1
     JMP  DONE ;无条件跳转
LOP1:JZ  ZEROO   ;等于0转移
     MOV Y,1 ;大于0则赋值1
     JMP  DONE
ZEROO:MOV  Y,0
DONE: MOV AH,4CH  ;返回DOS
     INT 21H
CODE ENDS
   END START

posted @ 2009-04-15 15:33 fatkun 阅读(139) 评论(0) 编辑

例3.编定程序,将带符号的字节数组ARRY中最大数找出来,送到MAX单元中。

3.编定程序,将带符号的字节数组ARRY中最大数找出来,送到MAX单元中。

分析:在字节数组中找出最大数,可以把每1个数送AL中,让AL与第2个数及它后面的每一个数进行比较,每次比较时将大者放AL中,最后把AL的值送MAX单元。

DATA SEGMENT
ARRY  DB 23H,78H,0ABH,0CDH,00H,56H
    DB  14H,86H,0EFH,0BCH,10H,0C0H
CNT EQU $-ARRY     ;字节个数
MAX  DB  ?    
DATA ENDS

STACK SEGMENT PAPA 'STACK'
DW 20H DUP(0)
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STEG  段地址说明
START:
    MOV AX,DATA
     MOV DS,AX  ;数据段地址装填
     LEA  SI,ARRY ;初始化地址指针 
     MOV CX,CNT-1 ;设置循环次数
     MOV AL,SI 
LOP1:  INC SI   ;地址指针增1
     CMP AL,[SI] ;与下一个数比较
     JGE  LOP2  ;大于等于时转LOP2
     MOV AL,[SI] ;取较大的数放AL寄存器中
LOP2: LOOP LOP1  ;判断终止条件,CX-1≠0则循环
     MOV MAX,AL  ;保存最大数
     MOV AH,4CH
INT 21H   ;返回DOS
CODE ENDS
   END START

posted @ 2009-04-15 15:32 fatkun 阅读(175) 评论(0) 编辑

例4.字符串显示子程序。

字符串显示子程序。

.MODEL SMALL   ;设置存储模式
.STACK
.DATA 
STRING DB 'how are you! $'  ;定义显示字符串
.CODE
 .STARTUP     ;程序入口
LEA DX,STRING  ;取字符串首址
CALL  SHOW   ;调用显示子程序
.EXIT 0    ;程序结束返回DOS
;字符串显示子程序,子程序名SHOW
SHOW PROC NEAR  ;过程属性为NEAR
 PUSH  AX  ;保护现场
  PUSH  DX
  MOV AH,9   ;设置显示功能号9
 INT 21H  ;调用DOS功能
 POP DX  ;恢复现场
 POP AX
 RET  ;返回
SHOW ENDP
END;源程序结束

posted @ 2009-04-15 15:31 fatkun 阅读(56) 评论(0) 编辑

test

function test() : String
{
	return 10;
}

posted @ 2009-04-15 13:11 fatkun 阅读(16) 评论(0) 编辑

8086指令系统和寻址方式&寄存器组

8086寄存器组

通用寄存器:
EAX: (Accumulator) 累加器. 也被IO指令使用.
EBX: (base) 计算存储器地址时常用作基址寄存器.
ECX: (count) 在移位.循环.串处理指令中用作隐含的计数器.
EDX: (data) 做双字长的运算时.和AX连用. 另外.它存放IO端口地址.
变址寄存器:
ESP: (Stack Point) 堆栈指针寄存器. 指示段顶的偏移地址.
EBP: (Base Point) 基址指针寄存器. 可与SS连用确定堆栈段中的某一地址.
EDI: (Destination Index) 目的变址寄存器. DI 和 ES连用.
ESI: (Source Index) 源变址寄存器. SI 和 DS 连用.
专用寄存器:
EIP: 指令指针寄存器. 与CS连用确定下一条指令的地址.
EFLAGS: 标志寄存器.常用标志如下:
OF 溢出 SF 符号 ZF 零 CF 进位 AF 辅助进位(第3位进位) PF 奇偶(结果的1的个数)
DF 方向 TF 陷阱(调试时若置位则每条指令后产生陷阱) IF 中断(1表示允许相应可屏蔽中断)
段寄存器:
CS: (code segement) 代码段
DS: (data segement) 数据段
ES: (extra segement) 附加段
SS: (stack segement) 堆栈段
FS: 80386后增加的附加数据段
GS: 80386后增加的附加数据段


实模式存储器寻址
用来解决16位字长的机器里提供20位地址的问题.
解决的办法是分段. 20位物理地址由16位段地址和16位偏移地址组成.
段地址是一个段的起始地址(低4位为0).又称段基地址.

段 偏移
cs ip
ss sp bp
ds bx di si 或一个16位数
es di


80x86指令系统和寻址方式

寻址方式
立即数 如 5H
寄存器 如 AX
直接寻址 如 [2000H]
寄存器间接寻址 如 [BX] ,当寄存器用EBP或ESP时.段寄存器为SS. 否则段寄存器为DS.
寄存器相对寻址 如 COUNT[SI]. 或 [COUNT+SI]
基址变址寻址: 如 [BX][DI] 或 [BX + DI]
相对基址变址寻址 如 COUNT[BX][DI] 或 [COUNT + BX + DI]
比例变址寻址 如 COUNT[ESI*4]

转移地址

段内直接:如:
JMP NEAR PTR PROGIA
JMP SHORT QUEST
其中PROGIA 和 QUEST 为断内符号地址. 在机器指令中它是一个位移量. 用IP和位移量的和做IP值.
NEAR 和 SHORT 表示近转移和短转移.

段内间接: 如:
JMP BX
JMP WORD PTR[BP+TABLE]
用寻址到的内存单元的值做IP值. 第2句的WORD PTR表示这是一个字的有效地址.

段间直接: 如:
JMP FAR PTR NEXT
其中FAR PTR 表示段间转移. 它用NEXT符号地址的偏移值做IP值.用NEXT的段地址做CS值.

段间间接: 如:
JMP DWORD PTR[INTERS+ BX]
其中DOWRD PTR 是双字操作符.表示在该地址上取双字. 其中一个字放入IP.一个字放入CS.

posted @ 2009-04-15 12:28 fatkun 阅读(436) 评论(0) 编辑

2009年4月1日

ASM实验二 (1.简单指令仿真)

MOV AX,2000H        
MOV DS,AX           ;给数据段DS赋初值2000H
MOV AX,1000H
MOV ES,AX            ;给扩展段ES赋初值 1000H
MOV SI,0002H         ;给通用寄存器赋初值
MOV BX,100H

MOV  [0100H],55H
MOV  [0101H],42H   
;给数据段偏移量为100H、101H的存储单元赋初值 
MOV  [0102H],24H
MOV  [0103H],25H   
;给数据段偏移量为102H、103H的存储单元赋初值
MOV  [0104H],77H
;给数据段偏移量为104H的存储单元赋初值

MOV  ES:[0100H],22H
MOV  ES: [0101H],33H   
;给附加段偏移量为100H、101H的存储单元赋初值 
MOV  ES: [0102H],11H
MOV  ES: [0103H],44H   
;给附加段偏移量为102H、103H的存储单元赋初值
MOV  ES: [0104H],88H
MOV  ES: [0105H],99H
;给附加段偏移量为104H、105H的存储单元赋初值    

;分别加上下面的语句得到结果
MOV AX, [BX]           ;AX = 4255H   
         
;分别加上下面的语句得到结果
ADD AX, ES:[BX]         ;AX = 3322H + 1000h = 4322H          

;分别加上下面的语句得到结果
MOV CX, [BX+SI]    ;CX = 2524H
ADD AX, CX         ;AX = 3524H      

;分别加上下面的语句得到结果
MOV CX, ES:[BX+2*SI] ;CX = 9988H
ADD AX, CX           ;AX = A988H

posted @ 2009-04-01 15:21 fatkun 阅读(33) 评论(0) 编辑

2009年3月29日

[转]java下操作注册表方法

http://www.javaeye.com/topic/82291

 

由于java程序是“write once, run everywhere”,用java读写注册表,那程序的跨平台性就差了。java对注册表的操作,在jdk1.4以前的版本中,那是不可能的,只能用JNI来实现;然而jdk1.4之后提供的prefs包可以操作windows注册表,不过定死了root只在SOFTWARE/JavaSoft/prefs下,估计也是出于这种两难吧,又要保证所谓平台无关,还要照顾大家对windows的依赖。下面将从两方面来介绍对注册表的操作。
一、 使用JDK提供的Preferences类
二、 用jRegistry 来操作注册表

 

具体看上面的地址

posted @ 2009-03-29 14:56 fatkun 阅读(51) 评论(0) 编辑

导航

公告