.include "io32.inc"
.intel_syntax noprefix
.data
msg_prompt: .asciz "Enter a decimal digit string (max 20 digits): "
msg_prompt_len = . - msg_prompt - 1
msg_max: .asciz "Maximum digit: "
msg_max_len = . - msg_max - 1
msg_min: .asciz "Minimum digit: "
msg_min_len = . - msg_min - 1
msg_sum: .asciz "Sum of digits: "
msg_sum_len = . - msg_sum - 1
msg_product: .asciz "Product of max and min: "
msg_product_len = . - msg_product - 1
newline: .byte 10, 0
newline_len = 1
input_buf: .space 22 # 20 digits + newline + null
max_digit: .byte 0
min_digit: .byte 0
digit_sum: .long 0
product: .long 0
.text
.global _start
_start:
# 显示输入提示
mov eax, 4 # sys_write
mov ebx, 1 # stdout
mov ecx, offset msg_prompt
mov edx, msg_prompt_len
int 0x80
# 读取输入字符串
mov eax, 3 # sys_read
mov ebx, 0 # stdin
mov ecx, offset input_buf
mov edx, 21 # 读取最大21字符
int 0x80
# 移除换行符
push offset input_buf
call remove_newline
add esp, 4
# 处理数字并计算结果
push offset input_buf
call process_digits
add esp, 4
# 输出最大数字
mov eax, 4 # sys_write
mov ebx, 1 # stdout
mov ecx, offset msg_max
mov edx, msg_max_len
int 0x80
movzx eax, byte ptr [max_digit]
push eax
call print_char
add esp, 4
call print_newline
# 输出最小数字
mov eax, 4 # sys_write
mov ebx, 1 # stdout
mov ecx, offset msg_min
mov edx, msg_min_len
int 0x80
movzx eax, byte ptr [min_digit]
push eax
call print_char
add esp, 4
call print_newline
# 输出数字和
mov eax, 4 # sys_write
mov ebx, 1 # stdout
mov ecx, offset msg_sum
mov edx, msg_sum_len
int 0x80
push dword ptr [digit_sum]
call print_number
add esp, 4
call print_newline
# 输出乘积
mov eax, 4 # sys_write
mov ebx, 1 # stdout
mov ecx, offset msg_product
mov edx, msg_product_len
int 0x80
push dword ptr [product]
call print_number
add esp, 4
call print_newline
# 退出程序
mov eax, 1 # sys_exit
xor ebx, ebx
int 0x80
# 子程序:移除换行符
remove_newline:
push ebp
mov ebp, esp
mov esi, [ebp+8] # 输入字符串地址
remove_loop:
mov al, [esi]
test al, al
jz end_remove
cmp al, 10 # 换行符ASCII=10
je found_newline
inc esi
jmp remove_loop
found_newline:
mov byte ptr [esi], 0
end_remove:
pop ebp
ret
# 子程序:处理数字字符串
process_digits:
push ebp
mov ebp, esp
push esi
push ebx
mov esi, [ebp+8] # 输入字符串地址
mov dword ptr [digit_sum], 0 # 数字和归零
mov ecx, 0 # 有效数字计数器
# 初始化min_digit为9,max_digit为0
mov byte ptr [min_digit], '9'
mov byte ptr [max_digit], '0'
process_loop:
mov al, [esi]
test al, al
jz end_process
# 检查是否为数字(ASCII 48-57)
cmp al, '0'
jb next_char
cmp al, '9'
ja next_char
# 更新最小值
cmp al, [min_digit]
jae check_max
mov [min_digit], al
check_max:
# 更新最大值
cmp al, [max_digit]
jbe update_sum
mov [max_digit], al
update_sum:
# 累加数字和
sub al, '0' # 字符转数字
movzx eax, al
add [digit_sum], eax
inc ecx
# 检查是否超过20个数字
cmp ecx, 20
jae end_process
next_char:
inc esi
jmp process_loop
end_process:
# 计算乘积:max × min
mov al, [max_digit]
sub al, '0'
mov bl, [min_digit]
sub bl, '0'
mul bl
mov [product], eax
pop ebx
pop esi
pop ebp
ret
# 子程序:打印字符
print_char:
push ebp
mov ebp, esp
sub esp, 4 # 为局部变量分配空间
# 将字符存入局部变量
mov al, byte ptr [ebp+8]
mov byte ptr [ebp-4], al
# 系统调用输出字符
mov eax, 4 # sys_write
mov ebx, 1 # stdout
lea ecx, [ebp-4] # 字符地址
mov edx, 1 # 输出长度=1
int 0x80
add esp, 4 # 清理栈空间
pop ebp
ret
# 子程序:打印换行
print_newline:
mov eax, 4 # sys_write
mov ebx, 1 # stdout
mov ecx, offset newline
mov edx, newline_len
int 0x80
ret
# 子程序:打印数字(递归实现)
print_number:
push ebp
mov ebp, esp
mov eax, [ebp+8] # 获取数字
# 处理0特殊情况
test eax, eax
jnz not_zero
push '0'
call print_char
add esp, 4
jmp end_print
not_zero:
# 递归打印高位数字
xor edx, edx
mov ecx, 10
div ecx # eax=商, edx=余数
test eax, eax
jz skip_recursion
push eax
call print_number
add esp, 4
skip_recursion:
# 打印当前位
add edx, '0'
push edx
call print_char
add esp, 4
end_print:
pop ebp
ret
修改代码