汇编语言-011(无符号乘法指令MUL、有符号乘法指令IMUL、对比MUL乘法指令与SHL移位方式、符号位扩展指令,CBW,CWD,CDQ、DIV 无符号除法指令、IDIV 有符号除法指令)

1:无符号乘法指令MUL

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
val1 WORD 2000h
val2 WORD 0100h
.code
main PROC;8位乘法mov al,5h  ;被乘数mov bl,10hmul bl     ;AX = 0050h ,CF,OF = 0;16位乘法mov ax,val1mul val2   ;DX:AX = 00200000h ,CF ,OF= 1 高部分不为零0了,CF,OF=1mov eax,12345hmov ebx,1000hmul ebx   ;EDX:EAX = 0000000012345000 ,CF,OF = 0INVOKE ExitProcess,0
main ENDP
END main

2:有符号乘法指令IMUL 单个操作数情况

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCmov al,48mov bl,4imul bl    ;AX = 00C0h ,OF=1   因为AH不是AL的符号扩展,因此OF =1mov al,-4mov bl,4imul bl  ;AX = FFF0h,OF =0 因为AH是AL的扩展,OF清零mov ax,48mov bx,4imul bx   ;DX:AX = 000000C0h,OF = 0 ;因为DX是AX的符号扩展,因此OF=0mov eax,+4823424mov ebx,-423imul ebx  ;EDX:EAX = FFFFFFFF86635D80h, OF = 0,因为EDX是EAX的符号扩展,OF = 0INVOKE ExitProcess,0
main ENDP
END main

3:有符号乘法指令IMUL 两个操作数情况, 三个操作数情况

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
word1 SWORD 4
dword1 SDWORD 4.code
main PROCmov ax,-16     ;AX = -16mov bx,2       ;BX = 2imul bx,ax     ;BX = -32imul bx,2      ;BX = -64imul bx,word1  ;BX = -256mov eax,-16    ;EAX = -16mov ebx,2      ;EBX = 2imul ebx,eax   ;EBX = -32imul ebx,2     ;EBX = -64imul ebx,dword1;EBX = -256;因为双操作数与三操作IMUL指令的目的操作数大小与乘积相同;因此会出现符号溢出mov ax,-32000imul ax,2     ;OF = 1 因为-64000不适合16位目的操作数,换成32就不会;三操作数imul bx,word1,-16  ;BX = word1 * -16imul ebx,dword1,-16 ;EBX = dword1 * -16imul ebx,dword1,-2000000000 ;符号溢出INVOKE ExitProcess,0
main ENDP
END main

4:对比MUL乘法指令与SHL移位方式的执行时间对比 (在现在大部分处理器执行时间都差不多了)

include Irvine32.inc.stack 4096
ExitProcee PROTO,dwExitCode:DWORDLOOP_COUNT = 0FFFFFFFFh
.data
intval DWORD 5
startTime DWORD ?.code
main PROCcall GetMseconds  ;获取开始时间mov startTime,eaxmov eax,intvalcall mult_by_shiftingcall GetMsecondssub eax,startTimecall WriteDeccall Crlfcall GetMseconds  ;获取开始时间mov startTime,eaxmov eax,intvalcall mult_by_MULcall GetMsecondssub eax,startTimecall WriteDecINVOKE ExitProcess,0
main ENDPmult_by_shifting PROCmov ecx, LOOP_COUNT
L1:push eax  ;保存原始EAXmov ebx,eaxshl eax,5shl ebx,2add eax,ebxpop eax  ;恢复EAXloop L1retmult_by_shifting ENDPmult_by_MUL PROCmov ecx,LOOP_COUNT
L1:push eax  ;保存原始EAXmov ebx,36mul ebxpop eax  ;恢复EAXloop L1ret
mult_by_MUL ENDPEND main

5:DIV 无符号除法指令

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dividend QWORD 0000000800300020h
divisor  DWORD 00000010h.code
main PROC;8位 AL商,AH余数mov ax,0083h  ;被除数mov bl,2      ;除数div bl        ;AL = 41h  ,AH =01h;16位,AX商,DX余数mov dx,0      ;清除被除数高16位mov ax,8003h  mov cx,100hdiv cx        ;AX=0080h  DX=0003h;32位 EAX商,EDX 余数mov edx,DWORD PTR dividend +4  ;高双字mov eax,DWORD PTR dividend     ;低双字div divisor       ;EAX = 08003000h  EDX = 00000020hINVOKE ExitProcess,0
main ENDP
END main

6:符号位扩展指令,CBW,CWD,CDQ

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
byteVal SBYTE -101
wordVal SWORD -101
dwordVal SDWORD -101.code
main PROCmov al,byteVal  ;AL = 9Bhcbw             ;AX = FF9Bhmov ax,wordVal  ;AX = FF9Bhcwd             ;DX:AX = FFFFFFF9Bhmov eax,dwordVal ;EAX = FFFFFF9Bhcdq              ;EDX:EAX = FFFFFFFFFFFFFF9BhINVOKE ExitProcess,0
main ENDP
END main

7:IDIV 有符号除法指令

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
byteVal SBYTE -48
wordVal SWORD -5000
dwordVal SDWORD +50000.code
main PROCmov al,byteVal  ;被除数低字节cbw             ;扩展到AHmov bl,+5idiv bl   ;AL = -9 ,AH =-3mov ax,wordVal  ;被除数低字cwd             ;扩展到DXmov bx,+256 idiv bx         ;商AX = -19  ,余DX = -136mov eax,dwordValcdqmov ebx,-256idiv ebx   ;EAX = -195  EDX = +80INVOKE ExitProcess,0
main ENDP
END main

8:进行除法时,检查除数不能为0

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
dividend WORD 0083h
divisor BYTE 2.code
main PROCmov ax,dividendmov bl,divisorcmp bl,0je NoDivideZero  ;为零就不进行除div blNoDivideZero:INVOKE ExitProcess,0
main ENDP
END main

9:计算算式 var4 = (var1 + var2)*var3

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
var1 DWORD 10
var2 DWORD 20
var3 DWORD 30
var4 DWORD ?.code
main PROC;var4 = (var1 + var2)*var3mov eax,var1add eax,var2mul var3jc tooBig   ;判断EAX是否放得下mov var4,eaxjmp next
tooBig:
next:INVOKE ExitProcess,0
main ENDP
END main

10:计算算式 var4 = (var1 * -5) / (-var2 % var3)

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
var1 DWORD 10
var2 DWORD 20
var3 DWORD 30
var4 DWORD ?.code
main PROC;var4 = (var1 * -5) / (-var2 % var3)mov eax,var2neg eaxcdqidiv var3  ;EDX=余数mov ebx,edx mov eax,-5imul var1  ;EDX:EAX = 左边表达式结果idiv ebxmov var4,eaxINVOKE ExitProcess,0
main ENDP
END main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)

编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容) P151 例4.9 汇编思路: AX右移四位后,使用BH接收AL的低四位数据,得到BH的八位数据…

[转 scrum] 大型项目开发使用敏捷是否合适?不该问的问题

原文地址:http://www.scrumcn.com/agiledev/html/?167.html转载于:https://www.cnblogs.com/cly84920/archive/2010/03/17/4426844.html

汇编语言-012(扩展加法指令ADC、带借位减法指令SBB、执行加法后进行ASCII调整指令、AAS 、AAM、AAD 、DAA指令将和数转成压缩十进制格式)

1:ADC : 扩展加法指令ADC .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCmov dl,0mov al,0FFhadd al,0FFh ;ALFEhadc dl,0 ;DL:AL 01FEhmov edx,0mov eax,0FFFFFFFFhadd eax,0FFFFFFFFh ;EAX FFFFFFFEhadc edx,0 …

c#中textbox属性_C#.Net中的TextBox.Visible属性与示例

c#中textbox属性Here we are demonstrating use of Visible property of TextBox Control. 在这里,我们演示了TextBox Control的Visible属性的使用。 Visible property contains two values 可见属性包含两个值 True: Using this - textbox can be visible on par…

VS2010报表

http://technet.microsoft.com/zh-cn/library/dd220516.aspx转载于:https://www.cnblogs.com/mingyongcheng/archive/2012/09/11/2679722.html

思维的领域特殊性

思维的领域特殊性 1971年,心理学家Danny Kahneman和Amos Tversky做了这样一个实验,他们问统计学教授一些不像统计学的统计学问题,其中一个大概如下:假设你生活的城市有两家医院,一家大一家小,某一天&#x…

汇编语言-013(DAS 、DAA与DAS、QWORD类型用SBB借位减法、编写指令将AX符号扩展到EAX,不能使用CWD、用SHR和条件判断指令将AL循环右移一位、SHLD、压缩十进制转换)

1:DAS : SUB或SBB在AL中生成二进制结果,DAS(减法后的十进制调整)转压缩十进制格式 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC;计算85-48mov bl,48hmov al,85hsub al,bl ;AL3Dhd…

python程序执行时间_用于在Python中查找程序执行时间的程序

python程序执行时间The execution time of a program is defined as the time spent by the system to execute the task. As we all know any program takes some execution time but we dont know how much. So, dont worry, in this tutorial we will learn it by using the…

公约数和公倍数

描述 小明被一个问题给难住了&#xff0c;现在需要你帮帮忙。问题是&#xff1a;给出两个正整数&#xff0c;求出它们的最大公约数和最小公倍数。 输入 第一行输入一个整数n&#xff08;0< n<10000)&#xff0c;表示有n组测试数据; 随后的n行输入两个整数i,j&#xff08;…

.net 笔记尝试(二)

.NET笔试题集&#xff08;二&#xff09; 1.using关键字有什么用&#xff1f;什么是IDisposable&#xff1f; using可以声明namespace的引入&#xff0c;还可以实现非托管资源的释放&#xff0c;实现了IDisposiable的类在using中创建&#xff0c;using结束后会自动调用该对象的…

网上照片之博客照片与网店照片拍摄心得

本文选自《非常摄影手记&#xff1a;2天玩转单反相机》一书 让照片在博客上更热的心得 1.有时美好的不仅是照片&#xff0c;还有拍摄照片的过程。尽量真实全面地记录自己的摄影过程&#xff0c;展示最感人的自我。 2.不要急功近利&#xff0c;不想成“名博”的博主不是好博主&a…

string.length_C.中的String.Length属性示例

string.lengthC&#xff03;String.Length属性 (C# String.Length property) String.Length property is used to get the total number of characters in the string object (length of the string); it calls with this string and returns the total number of characters. …

汇编语言-014(编写过程的应用、伪指令LEA、ENTER、LEAVE、LOCAL、递归函数、INVOKE、ADDR、PROC伪指令声明过程)

1&#xff1a;编写过程&#xff0c;仅用移位和加法&#xff0c;实现任意32位符号数与EAX相乘 include Irvine32.inc.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC mov eax,80mov ebx,53call BitwiseMultiplycall WriteDecINVOKE ExitProcess,0 main ENDP;EA…

从键盘输入一个字符,判断其是不是大写字母,如果是则请输出这个大写字母,如果不是请输出“这不是一个大写字母”的英文信息(要求:能连续输出直到输出“#”结束)。

从键盘输入一个字符&#xff0c;判断其是不是大写字母&#xff0c;如果是则请输出这个大写字母&#xff0c;如果不是请输出“这不是一个大写字母”的英文信息&#xff08;要求&#xff1a;能连续输出直到输出“#”结束&#xff09;。 P155 例4.13 DATA SEGMENT STR DB 0DH,0…

再谈angularjs DI(Dependency Injection)

在前面已经介绍了关于angularjs&#xff0c;以及扩展了一些jQuery ui的一些组件为angularjs的directive。在这里应进口007 在上篇留言我们来看看在angularjs中的DI特性。 DI&#xff1a;依赖注入&#xff0c;是一种软件设计模式&#xff0c;应DIP依赖倒置原则&#xff0c;描述组…

Access sql语句创建表及字段类型

Create TABLE 测试表 ( 文本255 VARCHAR NOT NULL, 文本20 VARCHAR(20) NOT NULL, 日期时间 DATETIME, 数字1 BYTE, 数字2 SMALLINT, 数字4 INTEGER, 布尔 BIT, 自动编号 COUNTER(10, 5) CONSTRAINT PK_TVIPLevel26 PRIMARY KEY, 小数 NUME…

c语言getc函数_C语言中的getc()函数与示例

c语言getc函数C语言中的getc()函数 (getc() function in C) Prototype: 原型&#xff1a; int getc(FILE *filename);Parameters: 参数&#xff1a; FILE *filenameReturn type: int 返回类型&#xff1a; int Use of function: 使用功能&#xff1a; In the file handling…

汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

1&#xff1a;使用PROC伪指令定义参数方式不通过寄存器传参&#xff0c;计算数组之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code ArraySum PROC USES esi ecx,ptr…

编写计算表达式(X-Y+25)/Z的值得程序,要求将其商和余数分别放在A、B单元中。(设X和Y是32位无符号数,A、B和Z是16位无符号数,不考虑溢出情况。)

编写计算表达式&#xff08;X-Y25&#xff09;/Z的值得程序&#xff0c;要求将其商和余数分别放在A、B单元中。&#xff08;设X和Y是32位无符号数&#xff0c;A、B和Z是16位无符号数&#xff0c;不考虑溢出情况。&#xff09; P151 例4.8 汇编思路&#xff1a;首先在DATA段定…

《深入浅出WPF》笔记——绑定篇(一)

上一节&#xff0c;有记录写到&#xff1a;在WPF里&#xff0c;数据驱动UI&#xff0c;数据占核心地位&#xff0c;UI次之。怎么恢复数据的核心地位&#xff0c;那就要先了解一下Binding。 一、Binding 基础 1.1WPF中Data Binding的带来的方便 在设计架构的时间&#xff0c;大家…