除法与汇编程序控制结构

实验内容

  • 内存中有132位整数数组,编程求整数数组最大值的元素下标,并在屏幕显示该下标的值。
  • 内存中有3个大小不同的32位整数数组,编程分别求这3整数数组最大值的元素下标,并在屏幕显示这些下标的
    值。
  • 内存中有132位整数数组,编程用选择排序方法对该整数数组排序,并在屏幕显示该数组排序前后的值。
  • 试编写汇编程序求无符号整数逆序,比如输入254679,程序输出将是976452

我的代码

输出一个数组最大值下标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
include irvine32.inc
.data
arr dd 40,50,33,75,36,45
sum dd 6 ;数组中元素个数
.code
main:
mov eax,[arr+0] ;eax存放最大值
mov ebx,0 ;ebx存放最大值下标
mov esi,1
again:
cmp esi,sum
jge final
cmp eax,[arr+esi*4]
jle L
inc esi
jmp again
L:
mov eax,[arr+esi*4]
mov ebx,esi
inc esi
jmp again
final:
mov eax,ebx
call writedec
end main

输出3个数组最大值下标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
include irvine32.inc
.data
arr1 dd 10,33,79
arr2 dd 60,7,55,0,13,47,33,34,16
arr3 dd 4,11,16,45,39
.code
main proc
push lengthof arr1
push offset arr1
call showmaxnumid

push lengthof arr2
push offset arr2
call showmaxnumid

push lengthof arr3
push offset arr3
call showmaxnumid

exit
main endp

;push lengthof arr
;push offset arr
;call showmaxnumid
;return nothing
showmaxnumid proc
push ebp
mov ebp,esp
pushad

mov edi,[ebp+8] ;edi=offset arr
mov ecx,[ebp+12];ecx=lengthof arr
mov eax,[edi+0]
mov ebx,0 ;ebx存放最大值下标
mov esi,1
again:
cmp esi,ecx
jge final
cmp eax,[edi+esi*4]
jge next
mov eax,[edi+esi*4]
mov ebx,esi
next:
inc esi
jmp again

final:
mov eax,ebx
call writedec
call crlf

popad
pop ebp

ret 8
showmaxnumid endp

end main

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
include irvine32.inc
.data
a dd 12,50,56,79,30,66,21,11,6
.code
main proc
push offset a
push lengthof a
call outputarr

push offset a
push lengthof a
call slectsort

push offset a
push lengthof a
call outputarr

exit
main endp

;push offset a
;push offset b
;call swap
;return nothing
swap proc
push ebp
mov ebp,esp
pushad

mov eax,[ebp+12];eax=offset a
mov ebx,[ebp+8] ;ebx=offset b
mov ecx,[eax] ;ecx=a
mov edx,[ebx] ;ebx=b
mov [eax],edx
mov [ebx],ecx

popad
pop ebp

ret 8
swap endp

;push offset a
;push lengthof a
;call selectsort
;return nothing
slectsort proc
push ebp
mov ebp,esp
pushad

mov ebx,[ebp+12];ebx=offset a
mov ecx,[ebp+8] ;ecx=lengthof a
mov esi,0 ;esi=i
again_1:
mov eax,ecx
dec eax
cmp esi,eax ;i<len-1?
jge final
mov eax,esi ;eax存放最小值下标 min=i
mov edi,esi
inc edi ;edi=j=i+1
again_2:
cmp edi,ecx
jge next
mov edx,[ebx+edi*4]
cmp edx,[ebx+eax*4]
jge L
mov eax,edi
L:
inc edi
jmp again_2

next:
lea edx,[ebx+eax*4]
push edx
lea edx,[ebx+esi*4]
push edx
call swap
inc esi
jmp again_1
final:
popad
pop ebp
ret 8
slectsort endp

;push offset a
;push lengthof a
;call outputarr
;return nothing
outputarr proc
push ebp
mov ebp,esp
pushad

mov ecx,[ebp+8] ;ecx=lengthof a
mov edi,[ebp+12];edi=offset a
mov esi,0
again:
cmp esi,ecx
jge final
mov eax,[a+esi*4]
call writedec
mov al,' '
call writechar
inc esi
jmp again
final:
call crlf

popad
pop ebp
ret 8
outputarr endp

end main

/*
选择排序
1. 算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。
2.C 语言
void swap(int *a,int *b) //交換兩個變數
{
int temp = *a;
*a = *b;
*b = temp;
}
void selection_sort(int arr[], int len)
{
int i,j;

for (i = 0 ; i < len - 1 ; i++) {
int min = i;
for (j = i + 1; j < len; j++) //走訪未排序的元素
if (arr[j] < arr[min]) //找到目前最小值
min = j; //紀錄最小值
swap(&arr[min], &arr[i]); //做交換
}
}
*/

整数逆序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
include irvine32.inc
.data
x dd ?
msg db '请输入一个无符号数:',0
ten dd 10
.code
main:
lea edx,msg
call writestring
call crlf
call readint ;x=eax
again:
cmp eax,0
jle final
mov edx,0
div ten
mov ebx,eax
mov eax,edx
call writedec
mov eax,ebx
jmp again
final:
call crlf

end main

补充文件