首页 > 编程知识 正文

div2(汇编语言imul)

时间:2023-05-03 13:22:00 阅读:93611 作者:4707

MUL是进行无符号乘法的命令。 MUL (无符号乘法)指令有三种格式: 第一,将8位操作数乘以al。 第二,16位的操作数乘以ax; 第三,32位操作数乘以eax

乘数和被乘数的大小必须相同,乘积的大小是乘数/被乘数大小的两倍。 三种格式都接受寄存器操作数和存储器操作数。 但是,不接受即时操作数。

例如:

想要将al寄存器的值加倍时,需要将即时数2存储在一个寄存器中,用mul指令相乘,或者将即时数存储在一个存储器地址中,作为存储器单元进行乘法运算。

例:

mov bl,2

美国职棒大联盟; 现在将bl寄存器的值乘以al寄存器的值

命令中唯一的操作数是乘数。

也就是说,当我们的乘数为8位时,与al相乘,当我们的乘数为16位时,与ax相乘,当我们的乘数为32位时,与eax寄存器相乘。

下面是有关mul乘法的操作数示例

被乘数积

al 8位操作数ax

ax 16位操作数dx:ax

eax 32位操作数edx:eax

因为如果我们的乘数是8位操作数,我们的结果就存在于ax寄存器中。 如果是16位的操作数,我们的结果存储在dx:ax中。 dx不为0时,设置进位标志。

执行mul命令后,一般会检查进位标志。 因为有必要知道积的高一半是否可以安全地忽略。

例如:

摩尔,6h

mov bl,10h

美国职棒大联盟

如果目前检查进位标志cf=0,则ah可以忽略,因此结果为60h。

让我再举一个例子:

例如:

mov ax,6000

mov bx,5000

美国广播公司

检查进位标志。 在此情况下,cf=1。 那么,我们的结果是dx:ax,此时我们的dx=1E00,ax=0000,所以最后我们的乘积是1E000000。

其实可以根据积计算出是否设置了cf。

1 .其次留下小作业,不要用其他辅助工具计算。 自己计算,执行后,积是多少?

mov eax,00800000

mov ebx,00200000

美国职棒大联盟

汇编的基础是一天学习31 IMUL

你好,今天我们来学习带符号整数乘法,IMUL指令吧。 这个命令保持乘积的符号位。 IMUL命令、IA - 32命令集有:单个操作数、2个操作数、3个操作数3种形式。 在单操作数格式中,乘数和乘数的大小相同,乘积的大小是乘数/乘数大小的两倍。

单操作数形式:单操作数形式将乘积存储在累加器(ax、dx:ax、edx:eax )中。 imul指令单操作数的形式其实和我们昨天学习的mul指令的形式基本相同。

1 .下面,我们来看看IMUL单操作数的格式:

imul 8位寄存器/8位存储器操作数

imul 16位寄存器/16位存储器操作数

imul 32位寄存器/32位存储器操作数

2 .双操作数格式:

imul 16位寄存器/16位寄存器-16位存储器操作数

imul 16位寄存器/8位即时数

imul 16位寄存器/16位即时数

从上述可知,按照双操作数形式,积可以存储在第一操作数中,第一操作数必须是寄存器,第二操作数可以是寄存器、存储器操作数或即时数。 的两个操作数以16位列举了一些例子。 当然32位也可以。

imul 32位寄存器/32位寄存器-32位存储器操作数

imul 32位寄存器/8位即时数

imul 32位寄存器/32位即时数

3.3操作数格式:

imul 16位寄存器/16位寄存器-16位存储器操作数/8位即时数

imul 16位寄存器/16位寄存器-16位存储器操作数/16位即时数

在3操作数格式中,乘积存储在第一个操作数中,16位寄存器可以乘以8位或16位的即时数。

imul 32位寄存器/32位寄存器-32位存储器操作数/8位即时数

imul 32位寄存器/32位寄存器-32位存储器操作数/32位即时数

有效位丢失后,将设置溢出标志和进位标志。 3使用操作数格式时,请务必在执行imul操作后检查相关的操作位。

是的,光凭理论我觉得你很模糊。 现在,让我们来看看一些实例:

1 .例如mov al,-3

mov bl,6

imul bl

当前执行时(-3*6)的结果保存在ax寄存器中。 如上所述,在使用imul执行有符号整数乘法时,保留乘积的符号位。 也就是说,积的上半部分是下半部分的符号扩展。 符号扩展是什么意思? 也就是说,如果我们的积是负数,那么高一半都是1,如果积是正数,那么高一半都是0。 很明显我们(-3*6)是负数,所

以此时高半部分肯定是1,不信大家来计算下。

-3的16进制表示形式是0FDh

好此刻我们将0FD转换成补码的形式,大家不知道还记得16进制整数转换补码的方法吗,用15减去各个进制位,最终结果+1。

此刻

FDh

15 - F = 0

15 - D = 2

+ 1 = 03h

03*6h = 12h (注意10进制18 = 16进制12h)

此刻我们将取12h的补码则为我们最后的乘积

12h

15 - 1 = E

15 - 2 = D

+ 1 = EEh

由于EEh的最高符号位是1,所以此时高半部分将扩展为低半部分的符号位,所以此时高半部分为FF(也就是全是二进制位1)。

最终的结果是FFEEh,此时由于已经被扩展了,所以此时的of = 0。(也就是说如果没有扩展的话,of = 1)。

2.再来看个例子

mov al, 3h

mov bl, 6h

imul bl

大家口算就可以算的出来,很显然3*6=18, 16进制 = 12h, 此时由于结果为正,因为结果是12h,但是我们也并不能通过of 或者是 if来指示乘积的高半部分是否为0,也就是说我们的imul虽然能进行无符号整数运算,但是我们不能通过它影响的标志位来进行判断。。

3. 再来看个例子

mov al, 48

mov bl, 3

imul bl

很显然我们的结果为正数,得到的积+144存放在ax中,由于ah不是al的符号扩展,因为溢出标志位置位。 of =1

4. 那么接下来我再来举个2操作数的。

mov ax, -30h

mov bx, 10h

imul ax, bx

那么-30 * 10 = -48 * 16 = -768

= -300h

然后我们求反码

300

15 - 3 = C

15 - 0 = F

15 - 0 = F

+ 1 = D00

因为我们的结果是负数,因为我们的结果是存在ax寄存器中的,而由于上面说了有符号数值的乘积是带符号位扩展的,高4位应该全是1填充,所以最终结果为FD00h

5.接下来我们来个3位操作数的。

mov ax, -30h

imul bx, ax, 2h

这三个操作数的是将结果存放在第一个操作数中。

-30 * 2 = -60

这时候取反码

15 - 6 = 9

15 - 0 = F

+1 = A0

乘积 = FFA0h,存放到bx中。

留个作业:

1.

mov ax, -60h

imul bx, ax, 3

问:乘积多少?

汇编基础一日一学习32 DIV

大家好,今天我们来学习下无符号整数的除法运算指令,div(无符号)指令执行8位、16位和32位无符号整数的除法运算。指令中必须是唯一的一个寄存器或内存操作数是除数。

div指令格式:

div 8位寄存器/8位内存操作数

div 16位寄存器/16位内存操作数

div 32位寄存器/32位内存操作数

div指令格式和我们的mul基本可以算作是相反的。那么我们看下被除数 、 除数、商、余数之间的关系。

被除数 除数 商 余数

ax 8位寄存器/8位内存操作数 al ah

dx:ax 16位寄存器/16位内存操作数 ax dx

edx:eax 32位寄存器/32位内存操作数 eax edx

1.

举个例子:

mov ax, 0060h

mov bl, 2

div bl ;al = 30h , ah = 00h

那么执行完后, 商是30h ,余数是00h

2.

在举个例子

执行(6005h/100h),由于我们的出示是16位,所以被除数是放在dx:ax中的。 但是由于被除数是6005h,所以我们必须将dx清0.

xor dx, dx

mov ax, 6005h

mov bx, 100h

div bx

那么执行后, 我们的ax = 0060h, dx = 0005h。 所以我们的商是60h, 余数是5h。

很简单。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。