汇编练习 实验一 基本编程方法练习

404 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

关于本人博客的声明

1.编写程序,完成下面公式的计算,并将结果输出

								A ←(X-Y+24)/ Z 的商,B ← (X-Y+24)/ Z 的余数
		其中,变量X,Y是32位有符号数,变量AB,Z是16位有符号数。
	
	

直接上代码,注释代码里面有

#include<stdio.h>

int x,y,tmp;  
short int a,b,z;

int main()
{
	printf("请按顺序输入x,y,z:\n");
	scanf("%d%d%d",&x,&y,&z);

	_asm{
		mov eax,x   ;把x给eax寄存器
		sub eax,y   ;执行x-y
		add eax,24		;x-y+24
		mov edx,eax   ;为了idiv准备
		shr edx,16     ;将高16位移到低十六位
		idiv z          ;用dx:ax  除以z (z是16位)  dx:ax   /   z   =  ax.......dx  (32位除以16位的模板)
		mov a,ax   ;把商移入a
		mov b,dx	 ;余数移入b
	}
	//printf("%d\n",tmp);
	printf("计算结果为:\n商:%d\n余数:%d\n",a,b);

	return 0;
}

2.把字数据X拆分成四个半字节数据,依次存放于其后单元中

#include<stdio.h>

short int x;
short int a,b,c,d;

int main()
{
	printf("请输入一个字数据:\n");
	scanf("%d",&x);
	//x=0x1234; 十进制:x=4660    (0x代表16进制)
	_asm
	{
		mov ax,x  ;x是十六位
		and ax,0fh  ;只保留低四位
		mov a, ax  ; a=4
		
		mov ax,x 
		and ax,0f0h  ;保留al中的高四位
		shr ax,4  ;逻辑右移四位
		mov b, ax  ;b=3

		mov ax,x 
		and ax,0f00h
		shr ax,8
		mov c, ax ;c=2

		mov ax,x 
		and ax,0f000h
		shr ax,12
		mov d, ax  ;d=1
	}
	
	printf("A=%d\nB=%d\nC=%d\nD=%d\n",a,b,c,d);

	return 0;
}

3.从键盘接收两个不大于5的十进制数字,并以十进制数据形式显示其和.

不要输入两个5,以免出现不能直接输出的情况。

#include<stdio.h>
short x,y;
int sum;
int main()
{
	printf("please input two integer that is less than five:");
	scanf("%d%d",&x,&y);

	_asm{
	mov ax,x
	add ax,y
	mov sum,eax
	}

	printf("the sum of %d and %d is: %d\n",x,y,sum);

return 0;
}

4.从键盘接收一个字符串(假定输入字符串长度大于3),试换行输出该字符串中第二个字符开始的连续2个字符

#include<stdio.h>

char s[100];
char a,b;

int main()
{	
	printf("please input a string that is more than three :\n");
	scanf("%s",s);

	_asm
	{
		lea ecx,s   ;取首地址
		mov al,[ecx+1]
		mov ah,[ecx+2]
		mov a,al
		mov b,ah
	}

	printf("the char is : %c and %c \n",a,b);

return 0;
}