[置顶]我的工具~
posted @ 2009-03-10 20:35 fatkun 阅读(22) 评论(0) 编辑
posted @ 2009-10-10 13:19 fatkun 阅读(17) 评论(0) 编辑
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.编写程序,求
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)。
分析:变量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单元中。
分析:在字节数组中找出最大数,可以把每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) 编辑
字符串显示子程序。
.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) 编辑
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) 编辑
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) 编辑
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) 编辑