
加10分帮你写
DATAS SEGMENT
HEXST DB '0123456789ABCDEF','$'
STR2 DB '===>NEG:','$'
ENTER DB 0DH,0AH,'$'
R0 DB 11111111B
R1 DB
DATAS ENDS
STACKS SEGMENT
db 500 dup()
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DL,R0
TEST DL,80H ;看最高位是否是1
JZ NEXT ;如果是正数
NEG DL
NEXT:
MOV R1,DL ;保存到R1
MOV DX,OFFSET STR2
MOV AH,09H
INT 21H
MOV DL,R1
AND DL,11110000B
MOV CL,04H
SHR DL,CL ;右移4位
MOV AL,DL
MOV BX,OFFSET HEXST
XLAT
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,R1
AND DL,00001111B
MOV BX,OFFSET HEXST
MOV AL,DL
XLAT
MOV DL,AL
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
这个是直接在内存中读取
补码的计算方式是求反加1
不论单字节还是多字节都是一样的
单字节不过是计算一个字节
多字节则是先将低字节求反加1,并将进位记下来;
然后对高字节求反,加上低字节的进位就行了
如果你的单板机支持双字节 *** 作,就更简单了,将低字节装入寄存器的低位,高字节装入高位,直接对寄存器求反加1就行了
#include<stdioh>
int main(){
int i,j,k;
int a[16], af[16], ab[16];//af存储反码,ab存储补码第0位为符号位
char b[16];
scanf("%s", b);
for(i = 0; b[i] != '\0'; i++){
a[i] = b[i] - '0';
}
j = i-1;
ab[0] = af[0] = a[0];//符号位始终不变
if(a[0] == 1){//当从屏幕输入的是负数,则作相应变换
for(i = j; i > 0; i--){
af[i] = 1 - a[i];
ab[i] = a[i];
if(a[i] == 1){
i--;
break;
}
}
k = i;
for(; i > 0; i--)
af[i] = 1 - a[i];
for(i = k; i > 0; i--)//补码从末位数起第一个不为0,以后均取反
ab[i] = 1 - a[i];
}
else{//如果是正数,则全部复制
for(i = j; i > 0; i--){//正数反码、补码都与原码相同
af[i] = a[i];
ab[i] = a[i];
}
}
printf("对应的反码是:\n");
for(i = 0; i <= j; i++)
printf("%d", af[i]);
printf("\n");
printf("对应的补码是:\n");
for(i = 0; i <= j; i++)
printf("%d", ab[i]);
}
在vc下编译测试通过。另,本代码未考虑输入非法问题,所输入的数字智能由1和0组成
以上就是关于用汇编语言求补码全部的内容,包括:用汇编语言求补码、双字节数取补码的程序,求分析怎么会是这样的、用C语言编一个程序,使给出一个数的原码,求得反码,补码。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)