汇编学习(1)

1.输入两个数,分别作为有符号和无符号数比较大小,输出较大值,并分别输出差值的绝对值。

 int a;
 int b;
 int max_signed;
 unsigned int max_unsigned;
 int differ_signed_abs;
 unsigned int differ_unsigned_abs;
 
 printf("a = ");
 scanf("%d", &a);
 printf("b = ");
 scanf("%d", &b);
 _asm{
	  MOV  EAX, a
	  MOV  EBX, b
	  MOV  max_signed, EAX
	  SUB  EAX, EBX
	  JG  L1
	  //若a<=b,max值取b,且差值取绝对值
	  MOV  max_signed, EBX 
	  NEG  EAX
	L1:
	  MOV  differ_signed_abs, EAX
	  
	  MOV  EAX, a
	  MOV  EBX, b
	  MOV  max_unsigned, EAX
	  SUB  EAX, EBX
	  JA  L2 
	  //同上
	  MOV  max_unsigned, EBX 
	  NEG  EAX
	L2:
	  MOV  differ_unsigned_abs, EAX
 }
 printf("有符号数比较较大值为:\t%d\n", max_signed);
 printf("有符号数比较差的绝对值为:\t%d\n", differ_signed_abs);
 printf("无符号数比较较大值为:\t%u\n", max_unsigned);
 printf("无符号数比较差的绝对值为:\t%u\n", differ_unsigned_abs);

2.输入四个字符,分别作为两个字和一个双字的数据,作为无符号数输出。

 char s[5];
 unsigned int dw;
 unsigned int w1, w2;

 printf("s = ");
 scanf("%s", s);
 _asm{
	  LEA  EAX, s  //获取字符串存储地址
	  MOV  EBX, w1  //获取w1存储地址
	  MOV  ECX, w2  //获取w2存储地址
	  
	  MOV  EAX, 0  
	  MOV  AX, DX  //取出低16位,即前两个字符
	  MOV  w1, EAX
	  
	  MOV  EAX, 0
	  SHR  EDX, 16  //将原高16位右移至低16位
	  MOV  AX, DX  //取出后两个字符
	  MOV  w2, EAX
}
printf("第一个字:\t%u\n第二个字:\t%u\n双字:\t%u\n",w1, w2, dw);

3.获取字符串长度

 char s[81];
 int len;

 printf("s = ");
 scanf("%s", s);
 _asm{
	  LEA  EAX, s  //获取字符串存储地址
	  MOV  ECX, -1  //初始化计数器
	L:
	  ADD  ECX, 1  
	  MOV  BL, [EAX + ECX] //取出第ECX个字符
	  CMP  BL, 0   //判定是否为'\0'
	  JNE  L
	  MOV  len, ECX
}
printf("字符串的长度为:\t%d\n", len);

猜你喜欢

转载自blog.csdn.net/qq_21110935/article/details/82812718