关于进制转换的一些问题,高分相送但求解释 ( 积分: 300 )

  • 主题发起人 主题发起人 app2001
  • 开始时间 开始时间
PChar和string是有区别的,
细节可参考经典书籍 <Delphi 5开发人员指南>
 
我来灌水,8086汇编写的部分函数。。 ^^

;文件名: SUBFUN.ASM
;内 容: 常用函数集

;子程序名: STRLEN
;功 能: 求字符串长度
;入口参数: ES:[DI]=待求长度字符串
;出口参数: AX=字符串长度
STRLEN PROC
PUSH SI
PUSH DI
PUSHF
CLD

MOV SI,DI

MOV CX,0FFFFH
MOV AL,'$'
REPNE SCASB

MOV AX,DI
SUB AX,SI
DEC AX

POPF
POP DI
POP SI
RET
STRLEN ENDP

;子程序名: STRREV
;功 能: 将字符串反转
;入口参数: ES:[DI]=待反转的字符串
;出口参数: ES:[DI]=反转后的字符串
STRREV PROC
PUSH SI
PUSH DI

CALL STRLEN ;字串长度

CMP AX,1 ;长度过短
JNA RRET
DEC AX

MOV SI,DI ;首尾指针
ADD DI,AX

RLP: MOV AL,[DI] ;首尾交换
XCHG AL,ES:[SI]
MOV [DI],AL

INC SI ;修改指针
DEC DI

CMP SI,DI ;指针相遇
JB RLP

RRET: POP SI
POP DI
RET
STRREV ENDP

;子程序名: ALTOASC
;功 能: 把4位2进制数值转成对应ASCII码
;入口参数: AL低4位=需要转换的整数
;出口参数: AL=数值对应的ASCII码
ALTOASC PROC
AND AL,0FH
OR AL,30H

CMP AL,3AH
JB BELOW
ADD AL,7
BELOW: RET
ALTOASC ENDP


;子程序名: ALTOBIN
;功 能: 把8位2进制数值转成2进制字符串
;入口参数: AL=需要转换的整数, ES:DI=字符串首地址
;出口参数: ES:[DI]=数值对应的2进制字符串
ALTOBIN PROC
PUSH DI
PUSHF
CLD

MOV DL,AL
MOV CX,8

BLP: ROL DL,1
MOV AL,DL
AND AL,1
OR AL,30H
STOSB
LOOP BLP

;LP: MOV AL,30H

SHL DL,1

JNC NC

OR AL,1
;NC: STOSB

LOOP LP

POPF
POP DI
RET
ALTOBIN ENDP


;子程序名: AXTOHEX
;功 能: 把16位2进制数值转成16进制字符串
;入口参数: AX=需要转换的整数, ES:DI=字符串首地址
;出口参数: ES:[DI]=数值对应的16进制字符串
AXTOHEX PROC
PUSH DI
PUSHF
CLD

MOV DX,AX
MOV CX,0404H

HLP1: ROL DX,CL
MOV AL,DL

CALL ALTOASC
STOSB

DEC CH
JNZ HLP1

POPF
POP DI
RET
AXTOHEX ENDP

;子程序名: ALTOHEX
;功 能: 把8位2进制数值转成16进制字符串
;入口参数: AL=需要转换的整数,ES:DI=字符串首地址
;出口参数: ES:[DI]=数值对应的16进制字符串
ALTOHEX PROC
PUSH DI
PUSHF
CLD

MOV AH,AL
MOV CX,0204H

HLP2: ROL AH,CL
MOV AL,AH

CALL ALTOASC
STOSB

DEC CH
JNZ HLP2

POPF
POP DI
RET
ALTOHEX ENDP


;子程序名: AXTODEC
;功 能: 把16位2进制数值(无符号)转成10进制字符串
;入口参数: AX=需要转换的整数, ES:DI=字符串首地址
;出口参数: ES:[DI]=数值对应的10进制字符串
AXTODEC PROC
PUSH SI
PUSH DI
MOV SI,DI

MOV BX,10
DLP1: XOR DX,DX ;DX=0
DIV BX ;DX=余数,AX=商

OR DL,30H ;对应字符
MOV [DI],DL
INC DI

CMP AX,0 ;(AX<>0)时继续
JNZ DLP1

MOV BYTE PTR [DI],'$' ;结束符号

MOV DI,SI
CALL STRREV ;反转字串

POP DI
POP SI
RET
AXTODEC ENDP

;子程序名: ALTODEC
;功 能: 把8位2进制数(无符号)转成10进制字符串
;入口参数: AL=需要转换的整数, ES:DI=字符串首地址
;出口参数: ES:[DI]=数值对应的10进制字符串
ALTODEC PROC
PUSH SI
PUSH DI
MOV SI,DI

MOV BL,10
DLP2: XOR AH,AH
DIV BL ;AH=余数,AL=商

OR AH,30H ;对应字符
MOV [DI],AH
INC DI

CMP AL,0 ;(AL<>0)时继续
JNZ DLP2

MOV BYTE PTR [DI],'$' ;结束符号

MOV DI,SI
CALL STRREV ;反转字串

POP DI
POP SI
RET
ALTODEC ENDP

;子程序名: ALTOSTR
;功 能: 把8位2进制数(有符号)转成10进制字符串
;入口参数: AL=需要转换的整数, ES:DI=字符串首地址
;出口参数: ES:[DI]=数值对应的10进制字符串
ALTOSTR PROC
PUSH SI
PUSH DI

CMP AL,0
JNL NLZERO
MOV byte ptr [DI],'-';负号
INC DI ;指针后移
NOT AL ;正值
INC AL

NLZERO: MOV SI,DI
MOV BL,10

DLP3: XOR AH,AH
DIV BL ;AH=余数,AL=商
OR AH,30H ;对应字符
MOV [DI],AH
INC DI ;指针后移
CMP AL,0 ;(AL<>0)时继续
JNZ DLP3

MOV BYTE PTR [DI],'$';结束符号
MOV DI,SI ;反转字串
CALL STRREV

POP DI
POP SI
RET
ALTOSTR ENDP
 
如果核心部分,效率很关键,那么其实使用汇编查表法基本上是最快的.
 
雾水
请教activex 控件问题 想用activex 做个画图板的 程序 就想程序附件中自带的哪个画图板一样 只要求画时出现笔的形状 可以改变粗细 和颜色 !就这点功能 其他的就不要了

也可以用form做!就是 用delpji做一个上述要求的画图板 大哥可以帮帮我吗?
我初学delphi 老总给个项目 要在网页中调用delphi activex 制作的这个 画图板控件
拜托!
我以在delphi 中的开发里 提出这个问题了!很希望得到您的指点!!跪谢!
 
感谢lichengbin和zjan521详细解释,也感谢chenybin的热心帮忙。这个贴我就结了,把分给lichengbin和zjan521分了,另也开一贴给热心的chenybin兄帮忙。
请chenyBin到下贴去领分
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3206649
至于反转函数这个贴,由于最近一段一直没时间进行测试,就暂告一下,但分也还是要给的。
请lichengbin到下贴领分
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1934965
请zjan521到下贴领分
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1391908
 
后退
顶部