一、在Visual Studio下建立汇编语言的编程环境
在当前解决方案下建立工程sort,汇编源程序名 sort1.asm,必须用asm32.inc
二、编制冒泡排序的程序
1. 从键盘输入0<n<100个有符号整数(32位),编制冒泡排序的程序,实现从小到大排序。然后输出显示。不采用子程序方式!
2. 要求:规定的输入输出界面。课堂检查时,数组元素寻址方式为:奇数学号[EBX+EDI*4][EBX+EDI*4+4] ,偶号arr[ESI*4]arr[ESI*4+4]。计数用ECX。
数据:若学号1150310118、身份证号230106199812216810,则输入10个数为 1 15 03 101 18 -230106 -1998 -12 -21 -6810 学号、身份证中字母为9
汇编程序:
头文件:
ASM32.INC
.386 ; 指定最低兼容的CPU
.MODEL FLAT, STDCALL ; 指定存储模式,函数调用缺省规范
.STACK 1024 ; 定义堆栈段,指定段大小,缺省4K
INCLUDELIB "D:\MSVCRT.LIB"; 连接C函数库
ExitProcess PROTO :DWORD
printf PROTO C : DWORD, : VARARG; C函数的声明
scanf PROTO C : DWORD, : VARARG
getchar PROTO C
chr$ MACRO any_text : VARARG;
LOCAL txtname
.DATA
txtname db any_text, 0
ALIGN 4
.code
EXITM <OFFSET txtname>
ENDM
sort1.asm
INCLUDE ASM32.INC
COUNT = 100
.DATA
ARR DWORD COUNT DUP(?)
N DWORD ?
.CODE
MAIN PROC
INVOKE printf,chr$("请输入数组元素个数:")
INVOKE scanf,chr$("%d"),OFFSET N
MOV ECX,N
MOV EBX,OFFSET ARR
MOV ESI,0
L1: PUSH ECX
INVOKE scanf,chr$("%d"),ADDR ARR[ESI*4]
POP ECX
INC ESI
LOOP L1
INVOKE getchar
MOV ECX,N
DEC ECX
L4: PUSH ECX
MOV ESI,0
L2: MOV EAX,ARR[ESI*4]
CMP DWORD PTR ARR[ESI*4+4],EAX
JGE LL
XCHG EAX,ARR[ESI*4+4]
MOV ARR[ESI*4],EAX
LL: INC ESI
LOOP L2
POP ECX
LOOP L4
MOV ECX,N
MOV ESI,0
L3: PUSH ECX
INVOKE printf,chr$("%-8d"),DWORD PTR ARR[ESI*4]
POP ECX
INC ESI
LOOP L3
INVOKE getchar
INVOKE ExitProcess,0
MAIN ENDP
END MAIN
sort2.asm
INCLUDE ASM32.INC
COUNT = 100
.DATA
V DWORD COUNT DUP(?)
N DWORD ?
.CODE
MAIN PROC
INVOKE printf,chr$("请输入数组元素个数:")
INVOKE scanf,chr$("%d"),OFFSET N
MOV ECX,N
MOV EBX,OFFSET V
MOV ESI,0
L1: PUSH ECX
LEA EAX,[EBX+ESI*4]
INVOKE scanf,chr$("%d"),EAX
POP ECX
INC ESI
LOOP L1
INVOKE getchar
MOV ECX,N
DEC ECX
L4: PUSH ECX
MOV ESI,0
L2: MOV EAX,[EBX+ESI*4]
CMP DWORD PTR [EBX+ESI*4+4],EAX
JGE LL
XCHG EAX,[EBX+ESI*4+4]
MOV [EBX+ESI*4],EAX
LL: INC ESI
LOOP L2
POP ECX
LOOP L4
MOV ECX,N
MOV ESI,0
L3: PUSH ECX
INVOKE printf,chr$("%-8d"),DWORD PTR [EBX+ESI*4]
POP ECX
INC ESI
LOOP L3
INVOKE getchar
INVOKE ExitProcess,0
MAIN ENDP
END MAIN