You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在汇编语言中将字符串输入转换为整数值以用于循环?

汇编实现字符串转整数及循环应用

需求说明

已通过键盘输入收集了名称字符串(存储于userStore)和偏移值字符串(存储于valStore),需要将valStore中的十进制数字字符串转换为整数,用于后续循环的偏移控制。

完整汇编代码实现

SECTION .data
userMsg db 'Please enter a name: ', 0
userMsgLen equ $-userMsg 
valMsg db 'Offset value: '
valMsgLen equ $-valMsg

valStore resb 255
userStore resb 255

SECTION .bss
s2 resb 255       ; 存储偏移处理后的结果
offset_val resd 1 ; 存储转换后的整数偏移值

SECTION .text
global  _start
 
_start:
; 提示输入名称
mov edx, userMsgLen
mov ecx, userMsg 
mov ebx, 1 
mov eax, 4 
int 80h 

; 读取名称输入到userStore
mov edx, 255        
mov ecx, userStore   
mov ebx, 0          
mov eax, 3          
int 80h 

; 提示输入偏移值
mov edx, valMsgLen
mov ecx, valMsg 
mov ebx, 1 
mov eax, 4 
int 80h 

; 读取偏移值字符串到valStore
mov edx, 255        
mov ecx, valStore   
mov ebx, 0          
mov eax, 3          
int 80h 

; --------------------------
; 将valStore中的字符串转换为整数
; --------------------------
mov esi, valStore   ; esi指向偏移值字符串起始
xor eax, eax        ; 初始化结果寄存器为0
mov ebx, 10         ; 十进制基数10
convert_loop:
mov cl, [esi]       ; 读取当前字符
cmp cl, 0x0A        ; 判断是否为换行符(输入结束标志)
je convert_done     ; 是换行则转换完成
cmp cl, '0'         ; 检查是否为有效数字字符
jb convert_done
cmp cl, '9'
ja convert_done
sub cl, '0'         ; 字符转数字
mul ebx             ; 结果 *=10
add eax, ecx        ; 加上当前数字
inc esi             ; 指针移到下一个字符
jmp convert_loop
convert_done:
mov [offset_val], eax ; 存储转换后的整数到内存

; --------------------------
; 使用偏移值进行循环处理示例(以偏移复制名称为例)
; --------------------------
mov esi, userStore  ; esi指向原始名称字符串
mov edi, s2         ; edi指向结果存储区
mov ecx, [offset_val] ; 设置循环计数器为偏移值
; 先跳过偏移量的字符
skip_loop:
cmp byte [esi], 0x0A ; 提前检查是否到字符串末尾
je copy_start
inc esi
dec ecx
jnz skip_loop
copy_start:
; 复制剩余字符到s2
copy_loop:
lodsb               ; 从esi读取一个字符到al,esi自增
cmp al, 0x0A        ; 判断是否到换行符(字符串结束)
je copy_done
stosb               ; 将al写入edi,edi自增
jmp copy_loop
copy_done:
mov byte [edi], 0   ; 添加字符串结束符

; 输出处理后的结果
mov edx, edi        ; 计算结果长度
sub edx, s2
mov ecx, s2
mov ebx, 1
mov eax, 4
int 80h

; 程序退出
mov eax, 1
xor ebx, ebx
int 80h

关键代码说明

  • 字符串转整数部分:
    • 利用mul ebx实现十进制进位(每次结果乘10),通过sub cl, '0'将ASCII字符转换为对应数字值,逐字符累加得到最终整数。
    • 以换行符0x0A作为输入字符串结束标志,同时过滤非数字字符。
  • 循环应用部分:
    • 将转换后的偏移值加载到ecx作为循环计数器,先跳过对应数量的字符,再复制剩余内容到目标缓冲区。
    • 使用lodsb和stosb指令简化字符串的读取与写入操作,这两条指令会自动维护esi和edi的指针偏移。

内容的提问来源于stack exchange,提问作者JakkuPingu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:07:04