endp 汇编start_汇编语言100例

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值