Tal*_*Tal 11 assembly machine-instruction x86-16
当我ADC用于exmaple时:
AL = 01 and BL = 02, and CF = 1
Run Code Online (Sandbox Code Playgroud)
当我做这个:
ADC AL,BL
Run Code Online (Sandbox Code Playgroud)
会AL是3或4?(CF加或不加?)
cod*_*ict 11
关于8086 ADC指令的一些事情:
Syntax: adc dest, src
dest: memory or register
src: memory, register, or immediate
Action: dest = dest + src + CF
Run Code Online (Sandbox Code Playgroud)
显然,该动作表示Carry Flag(CF)将包含在添加中,因此结果4不会3.
它与以10为基数添加没有什么不同。
99 +11 9 + 1是零携带1 9 + 1 +携带1携带1
上面的十进制数学运算的结果是10,进位为1,或者如果您想那样的话,则为110。
对于以一位加法器开头的二进制文件,这是真值表:
000 0 0 001 0 1 010 0 1 011 1 0 100 0 1 101 1 0 110 1 0 111 1 1
三位的左列是输入组合,两个操作数并进位,第二列被执行,第三列是结果
因此左列中没有进位的1 + 1为110,结果为1的进位为0。
与上面的十进制数学没什么不同,只是将十进制,操作数a,操作数b,进位加起来的方式更为简单。结果为模10的答案,进位为结果/ 10。将进位复制到下一列的顶部,并永远重复一次。如99 + 11或999 + 111等所示。
对于没有进位的简单两位加法,结果是输入的异或,进位是两个输入的和。您可以使用两个不带进位加法器的加法来实现加进位加法,也可以直接执行。当有一次奇数次或奇偶校验时设置结果,这是两个xor r = a xor b xor随身携带。我目前正在苦苦挣扎的随身物品也许有人可以提供帮助。
因此带有进位设置的8位0xFF + 0xFF将给出
1个 11111111 +11111111
这显示0xff + 0xff,在您开始之前会出现“携带一个”字样。
就像十进制数学一样,一次从右侧一次查看一列
1 + 1 + 1 = 1携带1 下一栏 1 + 1 + 1 = 1携带1 ...
这继续,您最终将进位设置为0xFF
因此,如果只有8位加进位,则可以将两个数字加起来等于您拥有的内存。
让我们看一下16位加法:
0x1234 + 0xABCD
您可以使用16位加法0xBE01进行数学运算。
或使用8位加法器:
清除进位 加进位0x34 + 0xCD结果0x01进位集 加进位0x12 + 0xAB结果0xBE进位清除
所以答案是0xBE01
或使用4位加法器(如果您只有4位ALU)
清除进位 加进位0x4 + 0xD = 0x1加进位 加进位0x3 + 0xC = 0x0进位设置 加进位0x2 + 0xB = 0xE加进位清零 加进位0x1 + 0xA = 0xB加进位清零
再次将结果0xBE01进位清除
我们也可以用一个位或一个3位加法器来做到这一点,只要它是二进制的就很简单了。
所有有用的处理器都必须有某种方式来添加进位,以便您可以扩展alu。有时会有单独的添加和adc,某些adc是一个额外的步骤,或者最痛苦的是没有进位的添加,如果在进位下带有立即清零的进位,则使用分支。
这也是移位或旋转通过进位位旋转的原因,因此您可以进行比寄存器/存储器位置的宽度宽的位移位。
与十进制相比,二进制乘法非常简单,但我将为您省一分,让您考虑一下。
是的,您可能并且应该已经编写了一个程序来尝试此操作。而且仍然可以,我可能会故意带您走错消息的道路。
| 归档时间: |
|
| 查看次数: |
28324 次 |
| 最近记录: |