- 浏览: 533243 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
汇编基础一日一学习30 MUL
大家好,今天这节课中我们来深入的学习下乘法指令。乘法指令有两种,一种是有符号整数乘法另一种是无符号整数乘法,今天我们来学习无符号整数乘法。
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*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.写出 执行(9003h/50h)后的商和余数,以及相关寄存器的值。
参考文档:
http://hi.baidu.com/ilovetaibai/blog/item/d850307cbe5a8c0329388a6e.html
http://hi.baidu.com/ilovetaibai/blog/item/c290eaf9362f78d5b58f3177.html
http://hi.baidu.com/ilovetaibai/blog/item/a79f911b20e651bf4bedbc55.html
大家好,今天这节课中我们来深入的学习下乘法指令。乘法指令有两种,一种是有符号整数乘法另一种是无符号整数乘法,今天我们来学习无符号整数乘法。
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*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.写出 执行(9003h/50h)后的商和余数,以及相关寄存器的值。
参考文档:
http://hi.baidu.com/ilovetaibai/blog/item/d850307cbe5a8c0329388a6e.html
http://hi.baidu.com/ilovetaibai/blog/item/c290eaf9362f78d5b58f3177.html
http://hi.baidu.com/ilovetaibai/blog/item/a79f911b20e651bf4bedbc55.html
发表评论
-
lea指令——一个为了方便的多余指令
2012-10-11 11:14 1757buf db 'loading ....' lea b ... -
align num
2012-09-08 11:09 1146align是个负责内存对 ... -
C++内嵌汇编(一):反汇编分析C++代码
2012-03-01 11:13 8504注:本文是“百度文库”中下载的文章^^谢谢作者 Sa ... -
loop指令
2011-07-22 10:48 5445loop 指令 格式: loop 标号 ... -
堆栈操作
2011-07-21 11:22 1282(软件)堆栈:由程序 ... -
MOVZX指令
2011-07-20 09:58 4677MOVZX指令 汇编语言数据传送指令MOV的变体。 ... -
跳转指令 jmp、call、ret、retf
2011-06-10 22:42 6856JMP、CALL和RET指 ... -
lodsb、stosb(和lodsw、stosw和lodsd、stosd指令)
2011-05-27 18:12 9322lodsb、stosb(和lodsw、stosw和lodsd、 ... -
8086/8088,80286,80386的CPU寄存器
2011-05-27 18:00 27648086/8088,80286,80386的CPU寄存器 ... -
NASM汇编HelloWorld
2011-05-27 17:53 12656一、Linux汇编介绍 1、DOS和Linux汇编主要不同 ... -
test指令
2011-05-27 11:22 3945首先我们来学习test指令 ...
相关推荐
两字节的乘法和四字节除以两字节的除法运算.采用松翰8位单片机汇编语言编写的子程序. 本人验证过.
随机的四则运算小程序,即可以用来给小学生做算术题,也便于VB初学者自学使用
this verilog code is alu. which is perform addition and sub,mul,div
python中的mul函数全文共5页,当前为第1页。python中的mul函数全文共5页,当前为第1页。python中的mul函数 python中的mul函数全文共5页,当前为第1页。 python中的mul函数全文共5页,当前为第1页。 Python中的mul...
计算机架构 该项目实现了流水线架构。 它显示了具有停顿的给定指令序列的时序图。 指令仅限于 add,sub,mul,div,ld(load),sd(store)
这是一个Web应用程序,它从Web表单中接收两个数字,执行[ADD,SUB,MUL,DIV]的一项操作,然后将其提交给宁静的Web API。 如何运行此应用程序。 下载或克隆仓库。 导航到index.html文件以使应用程序运行
C#例子代码 A0011_OO_Mul_InterfaceC#例子代码 A0011_OO_Mul_InterfaceC#例子代码 A0011_OO_Mul_InterfaceC#例子代码 A0011_OO_Mul_InterfaceC#例子代码 A0011_OO_Mul_InterfaceC#例子代码 A0011_OO_Mul_InterfaceC#...
这是一个用halcon打开的摄像头,很实用,很简单
MUL教程主要讲UML面向对象建模设计,UML的组成,和一些案例
[PHP]实用函数4
Verilog语言编写的单精度浮点数乘法器
MSP430 16x16=>32 multiply //long mul16(register int x, register int y)
很全的mui demo 官网的
假设在math目录下已编辑好add.c sub.c div.c mul.c func_point.c文件,func_point.c为包含main()的源文件! 动态库的制作: 方法一: gcc -c -fPIC add.c sub.c div.c mul.c //-c表示生成.o...
Implementation of an ALU that supports sum/sub mul and div
这是FPGA关于64bit乘法实现代码,可作为参考。
小波的代码-mul_c.m zhengxing.m sub_m.m rank_c.m mulscale_edge.m mul_c.m max_c.m ...
Addition, subtraction, division and multiplication in assembly. Between two 16-bits numbers.
IMUL DIV / IDIV 流量控制说明无条件的飞跃跳开关构造: 条件跳JE / JNE JZ / JNZ JL / JB-JG / JA JC和JO 环形: LOOPE / LOOPNE-LOOPZ / LOOPNZ 修改某些标志的值:(CF,DF,IF) 位处理说明逻辑指令和或者异或...
八位乘法器的VHDL程序,按照乘法的运算规则利用分支语句判断所有情况,最后累加求的结果