该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1.冒泡排序
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
array dd 34,12,3,18
szMsg db "%d",0ah,0
.code
start:
mov ecx,3 ;N-1
L2:
push ecx
xor esi,esi
mov ecx,3 ;N-1
L0:
mov ebx,array[esi]
cmp ebx,array[esi 4]
jb L1
xchg ebx,array[esi 4]
mov array[esi],ebx
add esi,4
L1:
loop L0
pop ecx
loop L2
xor esi,esi
mov ecx,4
L3:
push ecx
invoke printf,offset szMsg,array[esi]
add esi,4
pop ecx
loop L3
ret
end start
2,题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
canshu db "%d%d%d",0ah,0
x dd 1
y dd 1
z dd 1
.code
start:
mov ecx ,4
L0:
push ecx
mov y,1
mov ecx,4
push ecx
mov eax,x
L1:
cmp eax,y
jz L2
mov z,1
mov ecx ,4
L3:
push ecx
mov ebx,z
cmp ebx,x
jz L4
cmp ebx,y
jz L4
invoke printf ,offset canshu,x,y,z
L4:
inc z
pop ecx
loop L3
L2:
inc y
pop ecx
loop L1
inc x
pop ecx
loop L0
ret
end start
3 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
szMsg db "%d",0ah,0
x dw 100 ;被除数16位
midvalue dw ? ;中间值16位
chushu db ? ;除数8位
.code
start:
L1:
mov chushu,9
inc x
L0:
inc chushu
mov ax,x
div chushu
cmp al,chushu ;al存商
ja L0
jb L1
cmp ah,0 ;ah存余数
ja L1
mov bx,x
mov midvalue,bx
add midvalue,168
L2:
mov ax,midvalue
inc chushu
div chushu
cmp al,chushu
ja L2
jb L1
cmp ah,0
ja L1
sub x,100
mov ax,x
cwde
invoke printf,offset szMsg,eax
ret
end start
4 题目:编写简单的交换数字的程序
c语言实现:
swap(*a,*b)
汇编实现:
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
aa dword 8
bb dword 9
szMsg db "%d",0ah,0
.code
swapnum proc c a:ptr dword,b:ptr dword
local temp:dword
push eax
push ebx
push ecx
mov eax,a
mov ebx,ds:[eax];不要使用[a]的方式 ,mov ebx,[a]与mov ebx,a效果相同
mov temp ,ebx;[eax]为a
mov ecx,b
mov ebx,[ecx]
mov [eax],ebx
mov ebx,temp
mov [ecx],ebx
pop ecx
pop ebx
pop eax
ret
swapnum endp
start proc
invoke swapnum, offset aa, offset bb;与子程序参数要匹配
invoke printf,offset szMsg,aa
invoke printf,offset szMsg,bb
ret
start endp
end start
5.递归实现5的N次方
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
szMsg db "%d",0ah,0
.code
power proc c n:dword
cmp n,0
jle L0
dec n
mov ebx,n;?????
invoke power,ebx
mov ecx,5;5是底数
imul ecx;结果实际保存在EDX:EAX,但我们假设不越界,即结果只在EAX,EDX为0
ret ;从子程序退出,相当于C语言的return
L0:
mov eax,1
ret
power endp
start:
invoke power,3;3是指数
invoke printf,offset szMsg,eax
ret
end start
6 字符串操作练习
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
strsrc db "source string",0ah,0
strdst db 15 dup (?),0
szMsg db "%s",0ah,0
.code
strcopy proc
push ecx
push esi
push edi
mov ecx,lengthof strsrc
lea esi,strsrc
lea edi,strdst
cld ;df=0,esi edi是增加的
rep movsb
pop ecx
pop esi
pop edi
ret
strcopy endp
strdel proc c asc:byte ;传入将要删除的字符
push ecx
push esi
push edi
push ebx
xor ebx,ebx
mov ecx,lengthof strsrc
lea esi,strsrc
lea edi,strdst
L1:
cld
mov bl,asc
cmp [esi],bl
jnz L2
jz L0
L2:
movsb ;执行后esi,edi自动加1
jmp L3
L0:
inc esi
L3:
loop L1
pop ecx
pop esi
pop edi
pop ebx
ret
strdel endp
start:
;invoke strcopy
;invoke printf,offset szMsg,offset strdst
invoke strdel,'i'
invoke printf,offset szMsg,offset strdst
ret
end start
7 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\msvcrt.lib
printf proto C:dword,:vararg
.data
strtest db "adsf",0
szMsg db "%d",0ah,0
numcount dword 0 ;数字个数
asccount dword 0 ;字母
spacecount dword 0 ;空格
othercount dword 0 ;其他字符
.code
start:
push esi
push ecx
push eax
lea esi,strtest
mov ecx,lengthof strtest
L0:
mov al,20h ;空格的ascii码为20h
cmp [esi],al
jnz L1
inc spacecount
jmp L4
L1:
mov al,'0'
cmp [esi],al;注意在以后的比较也是这样,不可以cmp al,[esi]
;因为比较的是[esi]中的数。
jb other
mov al,'9'
cmp [esi],al
ja L2
inc numcount
jmp L4
L2:
mov eax,'A'
cmp [esi],al
jb other
mov al,'Z'
cmp [esi],al
ja L3
inc asccount
jmp L4
L3:
mov al,'a'
cmp [esi],al
jb other
mov al,'z'
cmp [esi],al
ja other
inc asccount
jmp L4
other:
inc othercount
L4:
inc esi
loop L0
pop esi
pop ecx
pop eax
invoke printf,offset szMsg, numcount
invoke printf,offset szMsg, asccount
invoke printf,offset szMsg, spacecount
invoke printf,offset szMsg,othercount
ret
end start