对有符号数据进行取补码的的时候,我们可以先将最高位清零 使用and ax,7f

然后 在使用neg 指令对ax 中的数据进行取反加1 就可以获取到。

;将内存中以BUF为首址的100个字节单元用原码表示的有符号数依次编程用补码表示的有符号数
;依次放在原100个字节单元中   
data segment 
    buf db 200 dup(?)    ;定义200个一字节的空间  用?来进行占位
    count equ 100        ;equ等值伪指令equ 常数值100赋给符号名count
data ends
stack segment para stack 'stack'  ;para 定位类型 stack 组合栈 '分类名' statck
    sta db 100 dup(?)    ;定义100个字节的空间 用?来进行占位
stack ends
code segment 
    assume cs:code,ds:data,ss:stack
 begin:mov ax,data       ;将数据段的段基址赋值给ax
    mov ds,ax            ;ax 数据段赋值给ds
    mov cx,count;         //串长送
    lea bx,buf            ;buf首地址送bx
  l2:test byte ptr[bx],80h ;[bx]最高位是否是0  对两个操作数进行 逻辑与操作 并修改标志位 但不会送结果
    jz l1;为0转l1   相当于最高位是一个0 不是一个有符号数 是一个正数 所以不需要修改 正数的补码就是其补码
    and byte ptr[bx],7fh;[bx]最高位清0   最高位清零
    neg byte ptr[bx];求负数     neg指令 对存储器中的数据 取反加1 获取的就是负数的补码形式
  l1:inc bx;指向下一个单元
     loop l2;cx-1>cx 不为0转l2
     mov ah,4ch     ;程序终止
     int 21h       ;返回dos程序
   code ends
end begin