对有符号数据进行取补码的的时候,我们可以先将最高位清零 使用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