邢台网站制作市场,it需要什么学历,教务系统网站建设模板下载,wordpress简历主题MUL是进行无符号乘法的指令。MUL(无符号乘法)指令有三种格式:第一种是将8位的操作数于al相乘。第二种是将16位的操作数与ax相乘; 第三种是将32位的操作数与eax进行相乘 乘数和被乘数大小必须相同#xff0c;乘积的尺寸是乘数/被乘数大小的两倍。 三种格式都既接受寄…MUL是进行无符号乘法的指令。MUL(无符号乘法)指令有三种格式:第一种是将8位的操作数于al相乘。第二种是将16位的操作数与ax相乘; 第三种是将32位的操作数与eax进行相乘 乘数和被乘数大小必须相同乘积的尺寸是乘数/被乘数大小的两倍。 三种格式都既接受寄存器操作数也接受内存操作数。但是不接受立即操作数(这点大家注意下)。 例如: 你想将al寄存器中的值乘上2那么此时你需要将立即数2存放到一个寄存器中然后通过mul指令相乘或者将立即数放到一个内存地址中然后通过内存单元的形式来进行相乘。 举例: mov bl, 2 mul bl ;此刻将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指令后我们一般要检查下进位标志。因为我们需要知道乘积的高半部分是否可以安全的忽略。 例如: mov al, 6h mov bl, 10h mul bl 此刻我们检查进位标志cf 0, 那么ah我们就可以将其忽略了所以结果是60h。 那么我们再来举一个例子: 例如: mov ax, 6000 mov bx, 5000 mul bx 我们检查进位标志此时cf 1。 那么我们的结果是dx:ax 此时我们的dx 1E00, ax 0000 所以 最后我们的积 为 1E000000。 其实我们从乘积就可以算出来cf是否置位了。 1.接下来我们留个小作业不要用其他辅助工具来计算。自己口算下,执行完后积为多少? mov eax, 00800000 mov ebx, 00200000 mul ebx 汇编基础一日一学习31 IMUL 大家好今天我们来学习下有符号整数的乘法运算IMUL指令。这个指令保留了乘积的符号位。IMUL指令IA - 32指令集中有三种格式: 单操作数、双操作数和三操作数。 在单操作数格式中乘数和被乘数尺寸大小相同乘积的大小是乘数/被乘数大小的两倍。 单操作数格式: 单操作数格式把乘积存储在累加器( 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.三操作数格式: imul 16位寄存器/ 16位寄存器-16位内存操作数/ 8位立即数 imul 16位寄存器/ 16位寄存器-16位内存操作数/ 16位立即数 三操作数格式把乘积存储在第一个操作数一个16位寄存器可以被一个8位或者16位的立即数乘。 imul 32位寄存器/ 32位寄存器 -32位内存操作数/ 8位立即数 imul 32位寄存器/ 32位寄存器 -32位内存操作数/ 32位立即数 如果有效位丢失则溢出标志和进位标志置位。 使用三操作数格式时一定要在执行完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*618, 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。 很简单。