用汇编语言求补码

用汇编语言求补码,第1张

加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语言编一个程序,使给出一个数的原码,求得反码,补码。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9313904.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存