汇编输入十个有符号数并排列
时间: 2024-02-13 07:01:55 浏览: 23
好的,以下是使用汇编语言编写的输入十个有符号数并排列的程序:
```
;将十个有符号数输入到数组中并排序
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
array db 10 dup(0)
msg1 db "Enter a signed number: ", 0
msg2 db 10, 13, "Sorted array: ", 0
.code
start:
push ebp
mov ebp, esp
;将数组指针存储在esi寄存器中
lea esi, array
;输入十个有符号数到数组中
mov ecx, 10
input_loop:
push ecx ;保存ecx寄存器的值
;显示提示信息
push offset msg1
call WriteString
;读取有符号数并存储到数组中
push esi
call ReadSignedNumber
inc esi
;恢复ecx寄存器的值并判断是否输入了十个数
pop ecx
loop input_loop
;将数组中的数排序
mov ecx, 10
sort_loop:
mov edi, 0
inner_loop:
mov al, [array+edi]
cmp al, [array+edi+1]
jg swap
inc edi
loop inner_loop
loop sort_loop
jmp display_array
swap:
xchg al, [array+edi+1]
mov [array+edi], al
inc edi
loop inner_loop
loop sort_loop
display_array:
;显示排序后的数组
push offset msg2
call WriteString
mov ecx, 10
mov esi, offset array
display_loop:
push ecx ;保存ecx寄存器的值
;显示当前数组元素的值
movzx eax, byte ptr [esi]
push eax
call WriteNumber
add esp, 4
inc esi
;恢复ecx寄存器的值并判断是否已经显示了所有元素
pop ecx
loop display_loop
;退出程序
push 0
call ExitProcess
;从标准输入中读取有符号数并返回它的ASCII码值
ReadSignedNumber proc pArray:DWORD
push ebp
mov ebp, esp
push edi ;保存edi寄存器的值
;读取用户输入
mov edx, pArray
movzx ecx, byte ptr [edx]
mov ah, 0Ah
mov edi, edx
inc edx
add edi, ecx
mov [edi], 0
;检查符号位并将其转换为ASCII码值
mov al, byte ptr [edx]
cmp al, '-'
jne skip_sign
neg byte ptr [edi]
inc edx
skip_sign:
sub byte ptr [edi], 30h
;恢复edi寄存器的值并退出函数
pop edi
pop ebp
ret
ReadSignedNumber endp
;将数字转换为ASCII码并显示它
WriteNumber proc number:DWORD
push ebp
mov ebp, esp
push ebx ;保存ebx寄存器的值
;将数字转换为ASCII码
mov ebx, 10
convert_loop:
xor edx, edx
div ebx
add dl, 30h
push edx
test eax, eax
jnz convert_loop
;显示ASCII码
pop eax
display_loop:
push eax
call WriteChar
pop eax
test eax, eax
jnz display_loop
;恢复ebx寄存器的值并退出函数
pop ebx
pop ebp
ret
WriteNumber endp
;显示字符串
WriteString proc pString:DWORD
push ebp
mov ebp, esp
;循环显示字符串中的每个字符
mov edx, pString
display_loop:
movzx eax, byte ptr [edx]
test eax, eax
jz done
push eax
call WriteChar
add esp, 4
inc edx
jmp display_loop
done:
;退出函数
pop ebp
ret
WriteString endp
;显示单个字符
WriteChar proc character:DWORD
push ebp
mov ebp, esp
;显示字符
mov dl, byte ptr [character]
mov ah, 02h
int 21h
;退出函数
pop ebp
ret
WriteChar endp
end start
```
这个程序使用了冒泡排序算法来对输入的十个有符号数进行排序。它将每个有符号数读取为一个字符串并存储到数组中,然后使用ReadSignedNumber函数将字符串转换为有符号数的ASCII码值。最后,它使用WriteNumber函数将ASCII码值转换为数字并显示数组的每个元素。