2023年4月22日,周六晚上。
今晚写汇编作业的时候,遇到了DIV指令,于是把学到的知识记录成一篇博客。此外,刚刚已经写了一篇关于MUL指令的博客了。
除数有8位和16位种,存放在寄存器或者内存中。
当除数为8位:
当除数为 8 位, 则被除数为 16 位
8进制能表示多大的数?
8位二进制能表示的无符号10进制数的范围:0到255
8位二进制能表示的有符号10进制数的范围:-128到127
8位二进制能表示的无符号16进制数的范围:0x00到0xFF
8位二进制能表示的有符号16进制数的范围:-0x80到0x7F
16位能表示多大的数?
16位二进制能表示的有符号16进制数的范围:0x8000到0x7FFF
16位二进制能表示的无符号16进制数的范围:0x0000到0xFFFF
16位二进制能表示的有符号10进制数的范围:-32768到32767
16位二进制能表示的无符号10进制数的范围:0到65535
MOV BL,5 ;把除数放在BL中,5是16进制数
被除数默认在 AX 中存放,
MOV AX,B ;把被除数放在AX中,B是16进制数
然后,用DIV指令让被除数与除数相除
DIV BL ;因为被除数默认存储在AX,所以除法操作只需要一个操作数来提供除数
结果都存放在AX中
低八位AL 存储除法的商,高八位 AH 存储除法的余数。
注:下图中的数都是16进制数
当除数为16位:
当除数为 16 位, 则被除数为 32位
32位能表示多大的数?
32位二进制能表示的有符号16进制数的范围:0x80000000到0x7FFFFFFF
32位二进制能表示的无符号16进制数的范围:0x00000000到0xFFFFFFFF
32位二进制能表示的有符号10进制数的范围:-2147483648到2147483647
32位二进制能表示的无符号10进制数的范围:0到4294967295
16位能表示多大的数?
16位二进制能表示的有符号16进制数的范围:0x8000到0x7FFF
16位二进制能表示的无符号16进制数的范围:0x0000到0xFFFF
16位二进制能表示的有符号10进制数的范围:-32768到32767
16位二进制能表示的无符号10进制数的范围:0到65535
被除数被分成两部分,分别存放在在DX和 AX中, AX 存放高 16 位, DX 存放低 16 位
假如被除数为10进制400000,那么变成16进制就是61A80
注意:下面这种写法是错误的!
MOV AX,0006
MOV DX,1A80
正确写法应该是:
MOV AX,1A80
MOV DX,0006
这是因为人和CPU是不一样的,
在人的眼中,61A80的高16位是0006,低16位是1A80
但在CPU眼中,61A80的高16位是1A80,低16位才是0006
除数放在16位寄存器或者内存中
假如被除数为10进制1000,那么变成16进制就是3E8
MOV BX,3E8
然后,用DIV指令让被除数与除数相除
DIV BX ;因为被除数默认存储在AX和BX,所以除法操作只需要一个操作数来提供除数
正确结果是应该是16进制190,也就是10进制的400
结果存放在AX和DX中,
则 AX存储除法操作的商, DX存储除法操作的余数.