StrToInt / IntToStr Asm For Delphi

本文介绍了一种使用汇编语言实现整数到字符串(IntToStr)及字符串到整数(StrToInt)的转换方法。通过具体的汇编指令,文章详细展示了如何处理正负数,并实现了数值的有效转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ContractedBlock.gifExpandedBlockStart.gifCode
function IntToStr(Value: Integer): ShortString;
// Value  = eax
// Result = edx
asm
  push ebx
  push esi
  push edi

  mov edi,edx
  
xor ecx,ecx
  mov ebx,
10
  
xor edx,edx

  cmp eax,
0 // check for negative
  setl dl
  mov esi,edx
  jnl @reads
  neg eax

  @reads:
    mov  edx,
0   // edx = eax mod 10
    
div  ebx     // eax = eax div 10
    add  edx,
48  // '0' = #48
    push edx
    inc  ecx
    cmp  eax,
0
  jne @reads

  dec esi
  jnz @positive
  push 
45 // '-' = #45
  inc ecx

  @positive:
  mov [edi],cl 
// set length byte
  inc edi

  @writes:
    pop eax
    mov [edi],al
    inc edi
    dec ecx
  jnz @writes

  pop edi
  pop esi
  pop ebx
end

 

ContractedBlock.gifExpandedBlockStart.gifCode


function StrToInt(Value: ShortString): Integer;
// Value   = eax
// Result  = eax
asm
  push ebx
  push esi

  mov esi,eax
  
xor eax,eax
  movzx ecx,Byte([esi]) 
// read length byte
  cmp ecx,
0
  je @exit

  movzx ebx,Byte([esi
+1])
  
xor edx,edx // edx = 0
  cmp ebx,
45  // check for negative '-' = #45
  jne @loop

  dec edx 
// edx = -1
  inc esi 
// skip '-'
  dec ecx

  @loop:
    inc   esi
    movzx ebx,Byte([esi])
    imul  eax,
10
    sub   ebx,
48 // '0' = #48
    add   eax,ebx
    dec   ecx
  jnz @loop

  mov ecx,eax
  
and ecx,edx
  
shl ecx,1
  sub eax,ecx

  @exit:
  pop esi
  pop ebx
end;

转载于:https://www.cnblogs.com/bsoom/archive/2009/11/26/1611589.html

<think>嗯,用户现在问的是Delphi中的IntToStr函数是什么。之前他们问过如何在Delphi中动态读取数据库并更新Label的数值,我在回答里提到了使用IntToStr将整数转换为字符串显示在Label的Caption上。现在用户可能对IntToStr的具体作用和用法不太清楚,需要进一步解释。 首先,我需要确认用户的基础知识。他们可能刚接触Delphi,对数据类型转换还不熟悉。IntToStrDelphi中的一个基本函数,用于将整数转换为字符串,这在处理用户界面显示时非常常见,比如将数据库中的数值显示在Label或Edit控件上。 接下来,我应该详细说明IntToStr的功能、语法和参数。需要举一些例子,比如IntToStr(100)返回'100',这样用户能直观理解。同时,要提到它的逆函数StrToInt,以及转换失败时的异常处理,比如使用TryStrToInt来避免程序崩溃。 用户可能想知道为什么不能直接将整数赋值给Caption属性,这时候需要解释类型转换的必要性,因为Caption是字符串类型,而数值是整数,类型不匹配会导致错误。这时候IntToStr就派上用场了。 另外,用户可能会遇到转换错误的情况,比如非数字字符串转整数,所以需要强调异常处理的重要性,给出示例代码说明如何处理这些错误。同时,可以提到TryStrToInt函数,它是一个更安全的替代方法,返回布尔值而不是抛出异常。 还要注意用户可能的实际应用场景,比如在数据库操作、文件处理或界面显示中的使用,举一些实际例子帮助用户理解。例如,将数据库查询得到的整数字段转换为字符串显示在Label上,或者在计算后需要将结果显示为文本。 最后,总结IntToStr的作用,强调它在Delphi编程中的基础性和实用性,帮助用户巩固记忆。同时,提醒用户注意类型转换可能带来的问题,并建议使用安全的转换方法来增强程序的健壮性。</think>在 Delphi 中,`IntToStr` 是用于**将整数(Integer)转换为字符串(String)**的系统函数,属于 `SysUtils` 单元的基础功能。它在界面显示、数据拼接等场景中广泛应用。 --- ### 一、核心功能 - **输入**:整数(如 `123`) - **输出**:对应的字符串(如 `'123'`) - **典型用途**: - 将数值显示在 `Label.Caption`、`Edit.Text` 等字符串属性中 - 拼接带数值的字符串(如日志、SQL 语句) --- ### 二、基本用法示例 ```delphi var Number: Integer; Text: string; begin Number := 42; Text := IntToStr(Number); // 结果: Text = '42' Label1.Caption := '答案: ' + IntToStr(Number); // 显示 "答案: 42" end; ``` --- ### 三、逆操作函数 `StrToInt` 若需要将字符串转回整数,使用 `StrToInt`: ```delphi var Text: string; Number: Integer; begin Text := '2024'; Number := StrToInt(Text); // 结果: Number = 2024 end; ``` --- ### 四、注意事项 1. **异常处理** `StrToInt` 遇到非数字字符串时会抛出 `EConvertError` 异常,建议使用安全转换: ```delphi var Text: string; Number: Integer; begin Text := 'abc'; if TryStrToInt(Text, Number) then // 安全转换(返回布尔值) ShowMessage(IntToStr(Number)) else ShowMessage('无效数字'); end; ``` 2. **数值范围** - `IntToStr` 支持 `Integer` 类型(范围:$-2^{31}$ 至 $2^{31}-1$) - 更大数值需用 `Int64ToStr`(处理 `Int64` 类型) --- ### 五、常见应用场景 1. **界面显示** ```delphi // 动态显示计算结果 Label1.Caption := '合计: ' + IntToStr(Price * Quantity); ``` 2. **数据库操作** ```delphi // 拼接带条件的 SQL 语句 SQL := 'SELECT * FROM orders WHERE user_id = ' + IntToStr(UserID); ``` 3. **文件/日志处理** ```delphi // 生成带序号的文件名 FileName := 'log_' + IntToStr(FileIndex) + '.txt'; ``` --- ### 六、扩展知识 - **格式化数字**:用 `Format` 函数控制显示格式(如千位分隔符) ```delphi Text := Format('%.2n', [1234567.89]); // 输出 '1,234,567.89' ``` - **十六进制转换**:`IntToHex` ```delphi HexStr := IntToHex(255, 2); // 结果: 'FF' ``` --- 通过 `IntToStr` 可轻松实现数值与文本的转换,是 Delphi 开发中高频使用的基础函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值