汇编有符号除法运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编有符号除法运算相关的知识,希望对你有一定的参考价值。

汇编语言一个3字长的有符号被除数,一个1字长的有符号的除数,求两个数相除的商和余数。。。各位大神求代码啊。。。

参考技术A data1 dw ??,??,??
data2 dw ??

;data1 / data2

mov eax,data1
movsx edx,word ptr [offset data1+4]
movsx ebx,word ptr data2
idiv ebx

商eax
余数edx追问

能简单点吗??新手有点看不懂。。。有解答更好。。

追答

data1 dw ??,??,??
data2 dw ??

;data1 / data2

mov eax,data1
lea ecx,data1
add ecx,2
mov dx,[ecx]
movsx edx,dx
mov bx,data2
movsx ebx,bx
idiv ebx

二柱子-四则运算2

一、设计思想

1、避免重复:输出时,确定了运算符号,两个运算数都相同时,重新随机产生操作数,再循环重新产生式子。
2、可定制:设计菜单,可选择数目,也可进行下列各项的选择。
3、是否有乘除法:菜单中选择了有乘除法,则无需修改;无乘除法,则随机产生的运算符号中就去除产生乘除的数字的可能。
4、是否有括号:如果选择了有括号的,可像运算符号那样,产生1-2随机数,根据随机数产生左右括号。
5、数值范围:在菜单中可选择是50以内、100以内等的选项,可在产生随机数中确定两个运算数的范围。
6、加减有无负数:若选择有负数,则无需修改;若选择无负数,则当运算符号为减号时,要判断第一个运算数是否比第二个大,是,则可以,否则,交换两个数。
7、除法有无余数:可以有余数,则无需修改;要求无余数,则进行除法时,计算结果,若有余数,重新产生,用循环进行。
8、是否支持分数:若不支持分数,则无需修改;若支持分数在产生运算数时,多加1-2个参数,用来作为分数的分子/分母。
9、是否支持小数:若不支持小数,则无需修改;若支持小数,则可增加参数,用来最为小数和小数点的确定。

二、源代码

  1 //信1301-2班——胡金辉     随机生成四则运算题目
  2 
  3 #include "stdafx.h"
  4 #include "stdlib.h"
  5 #include <time.h>
  6 
  7 int _tmain( )
  8 {
  9     srand(time(NULL)); //避免题目重复
 10     int x1,x2,flag,i,j;
 11     int x3,x4;
 12     int a[10];
 13     printf("---------------------------欢迎使用本系统打印题目!----------------------------\n");
 14     //可定制打印的题目数
 15     printf("请输入要打印的题目数:");   
 16     scanf("%d",&a[0]);
 17     while(a[0]<=0)  //题目数必须为正数
 18     {
 19         printf("请重新输入有效的题目数:");
 20         scanf("%d",&a[0]);
 21     };
 22     //可定制运算数的范围
 23     printf("请输入运算数的范围:");
 24     scanf("%d",&a[2]);
 25     while(a[2]<=0)  //运算数必须为正数
 26     {
 27         printf("请重新输入有效的范围:");
 28         scanf("%d",&a[2]);
 29     };
 30     //可定制题目中是否有乘除法
 31     printf("请选择否有乘除法(是->1;否->0):");
 32     scanf("%d",&a[1]);
 33     while((a[1]!=1)&(a[1]!=0)) //只能选择1或0
 34     {
 35         printf("请重新输入有效的数值:");
 36         scanf("%d",&a[1]);
 37     };
 38     //可定制题目结果是否有负数
 39     printf("请选择结果有无负数(是->1;否->0):");
 40     scanf("%d",&a[3]);
 41     while((a[3]!=1)&(a[3]!=0))  //只能选择1或0
 42     {
 43         printf("请重新输入有效的数值:");
 44         scanf("%d",&a[3]);
 45     };
 46     //可定制结果是否有余数
 47     printf("请选择结果有无余数(是->1;否->0):");
 48     scanf("%d",&a[4]);
 49     while((a[4]!=1)&(a[4]!=0))  //只能选择1或0
 50     {
 51         printf("请重新输入有效的数值:");
 52         scanf("%d",&a[4]);
 53     };
 54     
 55     //可定制是否支持小数
 56     printf("请选择是否支持小数(是->1;否->0):");
 57     scanf("%d",&a[5]);
 58     while((a[5]!=1)&(a[5]!=0))  //只能选择1或0
 59     {
 60         printf("请重新输入有效的数值:");
 61         scanf("%d",&a[5]);
 62     };
 63     
 64     //可定制是否加括号
 65     printf("请选择是否加括号(是->1;否->0):");
 66     scanf("%d",&a[6]);
 67     while((a[6]!=1)&(a[6]!=0))  //只能选择1或0
 68     {
 69         printf("请重新输入有效的数值:");
 70         scanf("%d",&a[6]);
 71     };
 72 
 73     //循环打印符合要求的题目
 74     for(i=0;i<a[0];i++)
 75     {
 76         switch(a[1]) 
 77         {
 78         case 1:j=rand()%4;break;  //有乘除法
 79         case 0:j=rand()%2;break;  //无乘除法
 80         }
 81         x1=rand()%a[2]+1;
 82         x2=rand()%a[2]+1;
 83         
 84         //循环打印
 85         if(j==0)
 86         {
 87             switch(a[6])
 88             {
 89             case 0:
 90                 switch(a[5])
 91                 {
 92                 case 0:printf("%d+%d=\t\t",x1,x2);break;
 93                 case 1:
 94                     x3=rand()%9+1;
 95                     x4=rand()%9+1;
 96                     printf("%d.%d+%d.%d=\t\t",x1,x3,x2,x4);break;
 97                 }
 98                 break;
 99                 
100             case 1:
101                 switch(a[5])
102                 {
103                 case 0:printf("(%d+%d)=\t",x1,x2);break;
104                 case 1:
105                     x3=rand()%9+1;
106                     x4=rand()%9+1;
107                     printf("(%d.%d+%d.%d)=\t",x1,x3,x2,x4);break;
108                 }
109                 break;
110             }
111         }
112         if(j==1)
113         {
114             switch(a[3])
115             {
116             case 1:                   //结果可有负数
117                 break;
118             case 0:                   //结果无负数
119                 if(x1<x2)            //被减数比减数小则交换
120                 {
121                     flag=x1;
122                     x1=x2;
123                     x2=flag;
124                 }
125                 break;
126             }
127             switch(a[6])
128             {
129             case 0:
130                 switch(a[5])
131                 {
132                 case 0:printf("%d-%d=\t\t",x1,x2);break;
133                 case 1:
134                     x3=rand()%9+1;
135                     x4=rand()%9+1;
136                     printf("%d.%d-%d.%d=\t\t",x1,x3,x2,x4);break;
137                 }
138                 break;
139                 
140             case 1:
141                 switch(a[5])
142                 {
143                 case 0:printf("(%d-%d)=\t",x1,x2);break;
144                 case 1:
145                     x3=rand()%9+1;
146                     x4=rand()%9+1;
147                     printf("(%d.%d-%d.%d)=\t",x1,x3,x2,x4);break;
148                 }
149                 break;
150             }
151         }
152         if(j==2)
153             switch(a[6])
154             {
155             case 0:
156                 switch(a[5])
157                 {
158                 case 0:printf("%d*%d=\t\t",x1,x2);break;
159                 case 1:
160                     x3=rand()%9+1;
161                     x4=rand()%9+1;
162                     printf("%d.%d*%d.%d=\t\t",x1,x3,x2,x4);break;
163                 }
164                 break;
165                 
166             case 1:
167                 switch(a[5])
168                 {
169                 case 0:printf("(%d*%d)=\t",x1,x2);break;
170                 case 1:
171                     x3=rand()%9+1;
172                     x4=rand()%9+1;
173                     printf("(%d.%d*%d.%d)=\t",x1,x3,x2,x4);break;
174                 }
175                 break;
176             }
177         if(j==3)
178         {
179         switch(a[4])
180         {
181         case 1:                         //结果可有余数
182             break;
183         case 0:                        //结果无余数
184             while(x1%x2!=0)            //如果不能整除,则重新生成
185             {
186                 x1=rand()%a[2]+1;   
187                 x2=rand()%a[2]+1; 
188             };
189             break;
190         }
191             switch(a[6])
192             {
193             case 0:
194                 switch(a[5])
195                 {
196                 case 0:printf("%d/%d=\t\t",x1,x2);break;
197                 case 1:
198                     x3=rand()%9+1;
199                     x4=rand()%9+1;
200                     printf("%d.%d/%d.%d=\t\t",x1,x3,x2,x4);break;
201                 }
202                 break;
203                 
204             case 1:
205                 switch(a[5])
206                 {
207                 case 0:printf("(%d/%d)=\t",x1,x2);break;
208                 case 1:
209                     x3=rand()%9+1;
210                     x4=rand()%9+1;
211                     printf("(%d.%d/%d.%d)=\t",x1,x3,x2,x4);break;
212                 }
213                 break;
214             }
215         }
216     }
217 
218     printf("------------------------------出题完毕,欢迎再次使用!--------------------------\n");
219 
220     return 0;
221 }

 

三、运行结果:

技术分享

技术分享

四、心得体会:

      1、编程过程中,一些基础的内容经常弄错、遗漏,比如输入、函数的定义等,需要练习加以巩固;

      2、开始我想的是将每一个新设功能写一个函数,再用主函数调用,但是真正编写的时候,由于功能之间有交叉,这样变量的引用和调用就出现了问题,最后我将它们都写到主函数中,各个参数都一次声明。这样的优点是编程方便、调用简单,缺点是不够清晰明了,当程序再大一些的时候非常不方便,以后需要找到别的方法去解决这个问题;

      3、我用的语言是C,它的界面不如C#美观、友好,但是编程简单、方便。

五、PSP0级相关日志

1、项目计划日志:

周活动总结表

姓名:胡金辉                                                           日期:2016/3/11

日期\任务

听课    

编写程序

阅读书本

考研复习

 

日总计  

周日

 

 

 

 

 

 

周一

 

 

 

 

 

 

周二

300

60

60

 

 

420

周三

100

25

40

60

 

225

周四

200

210

30

 

 

440

周五

200

 30

 

 

 

230

周六

 

 

 

 

 

 

周总结

 800

325 

130 

60 

 

1315 

阶段时间和效率                                                                        周数:1

不包括上一周在内的累计时间                                                                  

总计

    

    

    

    

    

平均

 

 

 

 

 

最大

 

 

 

 

 

最小

 

 

 

 

 

以前各周的累计时间                                                                             

总计

800 

325   

130

60 

1315 

平均

800    

325  

130  

60    

1315    

最大

800

325 

130 

60 

1315 

最小

800 

325

130 

60

1315 

2、时间记录日志:

学生:胡金辉                                                                     日期:3/11

教师:王建民                                                                      课程: PSP          

日期

开始时间

结束时间

中断时间

净时间

活动

备注

3/7

08:00

12:00

40

200

听课

课间休息

 

14:30

15:30

 

60

读书

 

 

16:10

18:00

10

100

听课

课间休息

 

19:30

21:00

30

60

编写程序

 

3/8

08:00

09:50

10

100

听课

课间休息

 

10:00

11:10

10

60

考研复习

 

 

16:10

16:35

 

25

编写程序

 

 

21:00

21:40

 

40

读书

 

3/9

09:00

09:50

 

50

编写程序

 

 

10:10

12:00

10

100

听课

课间休息

 

14:00

15:50

10

100

听课

课间休息

 

16:10

19:50

60

160

编写程序

吃饭

 

20:30

21:00

 

30

读书

 

3/10

08:00

12:00

40

200

听课

课间休息

 

14:30

15:00 

 

30

编写程序

 

 3、缺陷记录日志:

学生:胡金辉                                                                        日期:3/11

教员:王建民                                                                         程序号:01

日期

编号

类型   

引入阶段

排除阶段

修复阶段

修复缺陷

3/7 

1

 001

 设计

编译 

10min

 

描述:设计程序时调用函数传参错误

 

002 

设计 

 编译

1min 

 

描述:使用了某一函数没有它的头文件

 3/8

 3

003 

编码 

调试 

5min 

 

描述:使用do while循环时结构用错

 3/9

004 

编码 

编译 

1min

 

描述: 使用scanf输入时漏掉了“&”

  

 5

 005

编码 

编译 

1min 

 

描述:使用某一变量没有提前声明      

  

 6

 006

编码 

编译 

2min 

 

描述:使用数组时 ,整个数组和数组中某一元素弄混,导致出错     

  

 7

 004

编码 

编译 

1min

 

描述:使用scanf输入时漏掉了“&”      

  3/10

 8

007 

编码 

编译 

1min

 

描述:判断条件的等于应该是“==”,而我错用了“=”

 

 

以上是关于汇编有符号除法运算的主要内容,如果未能解决你的问题,请参考以下文章

Sass-除法

Python中整数运算除法,输出带浮点数

汇编语言 除法指令

逆向课程第五讲逆向中的优化方式,除法原理,以及除法优化下

PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

STM32单片机算法指令?