汇编学习笔记《一》

两个程序, 
 

1.从键盘输入10个学生成绩,然后输入一个查询成绩,找出是第几个学生的成绩。

2.将一个16进制的数字输出(字符形式)

提供了用于输入,输出的库。

第一个 想用字符串处理,然后数组的元素+1


include io32.inc
	.data
	cout dword 0
	studentdata byte 256 dup(0),0
	num byte 256 dup(0),0
	msgtipdis byte '请输入学生成绩',13,0
	msgreadstudentdata byte '第1个学生成绩',10,13,0  ;1-9个学生集中处理
	msgreadstudentdatas byte '第10个学生成绩',10,13,0 ;10特殊处理
	msgselect byte '请输入查找学生的分数',13,10,0
	msgselectwin byte '该学生是',0
                msgfailure byte '没有找到该学生',13,10,0
	.code
start:
	mov eax, offset msgtipdis
	call dispmsg
	mov ecx, 9
	mov ebx,offset studentdata
	disstudent:                    ;每次msgreadstudentdata[2]+1,屏幕分别显示1,2,3,4,5,6,7,8,9个学生
	mov eax,offset msgreadstudentdata
	call dispmsg
	mov eax,ebx
	call readmsg
	inc msgreadstudentdata[2]
	add ebx,2
	loop disstudent
	mov eax,offset msgreadstudentdatas
	call dispmsg 
	mov eax,ebx
	call readmsg
;mov eax,offset studentdata
;call dispmsg
	mov eax,offset msgselect ;查找学生分数的字符串
	call dispmsg
	mov eax,offset num;输入需要查找的学生成绩
	call readmsg;readmsg接口是 eax=[字符串地址]
	mov esi,offset studentdata;studentdata地址给esi
	mov edi, offset num;num地址给edi
	mov ecx,10;循环10次
again:
	inc cout
	mov bx,[esi]
	mov ax,[edi]
	and ax,65535
	and bx,65535
	cmp ax,bx    ;每次比对
je printf
	add esi,2
loop again
	jmp over
	printf:
	mov eax,offset msgselectwin
	call dispmsg
	mov eax,cout
	call dispsid
over:
	exit 0
	end start 

第2个有点蛋疼了,因为是32位存数,进行8次移位循环,每次ROL4位,本来很简单的,浪费了很多时间。

;转化16进制
include io32.inc   

.data
num1 dword 123ccH
promotmsg byte '16进制数字转化为字符输出.num=123ccH',13,10,0
result byte 'num=',32 dup(0),'H',13,10,0
.code

start:
	mov eax,offset promotmsg
	call dispmsg
	mov eax,num1
	mov ecx,8
	mov esi,0
	shiftfour:     ;每次移动4位
	  rol eax,4  ;循环右移动,每次移动4个位,地位不会丢失
	  push eax
	  call changefour
	  mov result+4[esi],al
	  pop eax
	  inc esi
	loop shiftfour
	mov eax,offset result
	call dispmsg
exit 0
     changefour:
          and eax,0fh
          or eax,30h      ;‘0’的ascall码值为30H
          cmp al,'9'
      jbe over
           add al,7
     over :       
          ret
end start



你可能感兴趣的:(汇编)