Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在汇编8086中使用带符号整数的ADD指令?_Assembly_Add_X86 16 - Fatal编程技术网

Assembly 如何在汇编8086中使用带符号整数的ADD指令?

Assembly 如何在汇编8086中使用带符号整数的ADD指令?,assembly,add,x86-16,Assembly,Add,X86 16,因此,如果我想添加两个无符号整数,我只需编写 dat1 db ff dat2 db ff res dw ? 在代码段中: mov ax, dat1 add ax, dat2 mov dl,0 adc dl,0 ;initialize the contents of dl and use it to store the carry flag mov byte ptr res, ax mov byte ptr res+1, dl 但是,如果我想添加两个有符号整数,代码会是什么样子?我能以某种方式

因此,如果我想添加两个无符号整数,我只需编写

dat1 db ff
dat2 db ff
res dw ?
在代码段中:

mov ax, dat1
add ax, dat2
mov dl,0
adc dl,0 ;initialize the contents of dl and use it to store the carry flag
mov byte ptr res, ax
mov byte ptr res+1, dl
但是,如果我想添加两个有符号整数,代码会是什么样子?我能以某种方式访问符号标志吗?

首先检查错误:

  • 它从只分配8位的变量中读取16位
  • 写地址res+1也没有意义(但是写地址res+2)
  • 同时尝试写入
    mov byte ptr addr,ax
    也会失败
    • 应该是
      mov word ptr res,ax
第一个问题的答案是:没什么特别的。
添加ax,bx
不关心它们是否已签名。有趣的部分是在检查状态寄存器时出现的。这里有进位标志、符号标志和溢出标志。(和25个以上不相关的标志)。作为旁注:如果进位标志!=符号\相同符号的加数的标志。这意味着两个负数的加法/减法可以解释为正数,或者两个正数的加法/减法可以解释为负数。对于不同符号的加数(3)+(-2),不会发生溢出

可以通过比较和分支来访问符号标志:

add ax,bx  
jns process_unsigned   // or
js process_signed  
或者,如果您想将寄存器的符号位转移到其他地方,您可以
-
mov-cl,16;sar-ax,cl//将符号位移到ax
-
add ax,ax
(或
shl ax,1
)//将符号位从ax的“左”端移出以携带位


此外,还可以
pushf
pop ax
将其放入通用寄存器,并检查任何单个位。

忽略示例代码中的错误(参见Aki的答案)

如果您试图添加一对24位数字;然后,前24位数字是正数,因为该数字的符号位位于移动到DL中的0的第7位(在
mov DL,0
指令中)。第二个24位数字也是正数,因为它的符号位位于添加到DL的0的第7位(在
adc DL,0
指令中)

在这种情况下,加法的结果将是正的(添加2个正数将得到正结果),CPU的符号标志将正确显示添加24位数字的结果是正的。CPU的进位标志和溢出标志也将正确(并且都将清除);因此,您可以使用诸如
js
jg
jo
(尽管您知道它们都很清楚,并且条件分支可以被删除或转换为
jmp
)之类的指令来正常测试它们。CPU的奇偶校验标志和零标志可能是错误的(例如,零标志仅表示最高8位是否全部为零,而不会告诉您整个24位是否全部为零)

然而,如果您认为您正在添加有符号的16位数字(并试图得到24位的结果),那么您做得不对,并且将得到错误的结果。要添加有符号的16位数字并获得24位结果,您必须对16位数字进行“符号扩展”,使其成为24位数字,而不是对这些数字进行“零扩展”。例如,16位(负)数字0xCDEF应成为24位(负)数字0xFFCDEF,而不是24位(正)数字0x00CDEF


另一种方法是像通常一样添加16位数字,然后将结果扩展到24位。这仅在16位加法没有溢出时有效,如果加法不能溢出,则不需要24位结果作为开始。

加法是相同的。这就是数学的伟大之处。这只是关于你如何解读这些数字。我不知道符号标志。这不是真的:
设置了溢出标志,如果进位标志!=符号标志。
-2+1=-1 OF=0 CF=0 SF=1.24位数字?你从哪里买的?