本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.编写程序,完成下面公式的计算,并将结果输出
A ←(X-Y+24)/ Z 的商,B ← (X-Y+24)/ Z 的余数
其中,变量X,Y是32位有符号数,变量A,B,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;
}