汇编语言第11章 无符号数与有符号数大小比较

无符号比较
cmp al,3
若al=3则ZF为1
若al≠3则ZF为0
若al<3则CF为1
若al≤3则CF为1或ZF为1
若al>3则CF为0,ZF为0
若al≥3则CF为0或ZF为1

有符号比较
cmp al,3
若OF为0,SF为1则al<3
若OF为0,SF为0且ZF为0则al>3
若OF为0,SF为0且ZF为1则al=3
若OF为1,SF为1则al>3
若OF为1,SF为0则al<3

溢出有两种情况。第一种是负数溢出,第二种是正数溢出。若是负数溢出则是向正数范围溢出,所以逻辑结果为正数实际结果为负数。若是正数溢出则是向负数范围溢出,所以逻辑结果为负数实际结果为正数。
在0~255中
[0,127]为正数区间
[128,255]为负数区间
若正数区间最大数127+1=128就会溢出到负数区间
若负数区间最小数128-1=127就会溢出到正数区间(若果不理解就把负数区间转化为有符号数)
所以说 如果因为溢出导致了实际结果为负,那么逻辑上真正结果必然为正
如果因为溢出导致了实际结果为正,那么逻辑上真正结果必然为负。
128有符号数是-128,-128-1=-129结果溢出,溢出到正数区间。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 用降幂法和除法将下列十进制转换为二进制和十六进制: (1) 369 (2) 10000 (3) 4095 (4) 32767 答:(1) 369=1 0111 0001B=171H (2) 10000=10 0111 0001 0000B=2710H (3) 4095=1111 1111 1111B=FFFH (4) 32767=111 1111 1111 1111B=7FFFH 1.2 将下列二进制转换为十六进制和十进制: (1) 10 1101 (2) 1000 0000 (3) 1111 1111 1111 1111 (4) 1111 1111 答:(1) 10 1101B=2DH=45 (2) 1000 0000B=80H=128 (3) 1111 1111 1111 1111B=FFFFH=65535 (4) 1111 1111B=FFH=255 1.3 将下列十六进制转换为二进制和十进制: (1) FA (2) 5B (3) FFFE (4) 1234 答:(1) FAH=1111 1010B=250 (2) 5BH=101 1011B=91 (3) FFFEH=1111 1111 1111 1110B=65534 (4) 1234H=1 0010 0011 0100B=4660 1.4 完成下列十六进制的运算,并转换为十进制进行校核: (1) 3A+B7 (2) 1234+AF (3) ABCD-FE (4) 7AB×6F 答:(1) 3A+B7H=F1H=241 (2) 1234+AFH=12E3H=4835 (3) ABCD-FEH=AACFH=43727 (4) 7AB×6FH=35325H=217893 1.5 下列各均为十进制,请用8位二进制补码计算下列各题,并用十六进制表示其运算结果。 (1) (-85)+76 (2) 85+(-76) (3) 85-76 (4) 85-(-76) (5) (-85)-76 (6) -85-(-76) 答:(1) (-85)+76=1010 1011B+0100 1100B=1111 0111B=0F7H;CF=0;OF=0 (2) 85+(-76)=0101 0101B+1011 0100B=0000 1001B=09H;CF=1;OF=0 (3) 85-76=0101 0101B-0100 1100B=0101 0101B+1011 0100B=0000 1001B=09H;CF=0;OF=0 (4) 85-(-76)=0101 0101B-1011 0100B=0101 0101B+0100 1100B=10100001B=0A1H;CF=0;OF=1 (5) (-85)-76=1010 1011B-0100 1100B=1010 1011B+1011 0100B=0101 1111B=5FH;CF=0;OF=1 (6) -85-(-76)=1010 1011B-1011 0100B=1010 1011B+0100 1100B=11110111B=0F7H;CF=0;OF=0 1.6 下列各为十六进制表示的8位二进制,请说明当它们分别被看作是用补码表示的带符号无符号时,它们所表示的十进制是什么? (1) D8 (2) FF
在8086汇编语言中,十六位乘法指令只能处理16位的据,如果要进行32位无符号乘法,需要调用两次十六位乘法指令,并将结果合并。具体实现方式如下: ```assembly ; 假设要计算乘积的两个据分别存储在内存地址offset1和offset2中 mov ax, [offset1] ; 将第一个据读入ax mov bx, [offset2] ; 将第二个据读入bx mul bx ; 进行16位乘法,结果存储在dx:ax中 mov cx, dx ; 将高16位结果存储在cx中 mov dx, ax ; 将低16位结果存储在dx中 ; 第二次乘法运算 mov ax, [offset1+2] ; 将第一个据的高16位读入ax mov bx, [offset2+2] ; 将第二个据的高16位读入bx mul bx ; 进行16位乘法,结果存储在dx:ax中 add cx, ax ; 将两次乘法的结果相加,得到32位乘积的高16位结果 ; 将结果存储在指定地址 mov [result+2], cx ; 存储高16位结果 mov [result], dx ; 存储低16位结果 ``` 对于带符号乘法,需要考虑到符号位的影响。可以采用符号扩展的方法来进行带符号的扩展。具体实现方式如下: ```assembly ; 假设要计算乘积的两个据分别存储在内存地址offset1和offset2中 mov ax, [offset1] ; 将第一个据读入ax mov bx, [offset2] ; 将第二个据读入bx ; 对第一个据进行符号扩展 mov dx, ax sar dx, 15 ; 获取符号位 cmp dx, 0 ; 判断符号位是否为0 je no_extend1 ; 如果符号位为0,则无需进行符号扩展 mov ah, 0 ; 如果符号位为1,则将高16位设置为FFFF mov al, 0FFh mov dx, ax ; 将扩展后的符号位存储在dx中 no_extend1: ; 对第二个据进行符号扩展 mov dx, bx sar dx, 15 ; 获取符号位 cmp dx, 0 ; 判断符号位是否为0 je no_extend2 ; 如果符号位为0,则无需进行符号扩展 mov ah, 0 ; 如果符号位为1,则将高16位设置为FFFF mov al, 0FFh mov dx, ax ; 将扩展后的符号位存储在dx中 no_extend2: imul bx ; 进行16位带符号乘法,结果存储在dx:ax中 mov cx, dx ; 将高16位结果存储在cx中 mov dx, ax ; 将低16位结果存储在dx中 ; 第二次乘法运算 mov ax, [offset1+2] ; 将第一个据的高16位读入ax mov bx, [offset2+2] ; 将第二个据的高16位读入bx ; 对第一个据的高16位进行符号扩展 mov dx, ax sar dx, 15 ; 获取符号位 cmp dx, 0 ; 判断符号位是否为0 je no_extend3 ; 如果符号位为0,则无需进行符号扩展 mov ah, 0 ; 如果符号位为1,则将高16位设置为FFFF mov al, 0FFh mov dx, ax ; 将扩展后的符号位存储在dx中 no_extend3: ; 对第二个据的高16位进行符号扩展 mov dx, bx sar dx, 15 ; 获取符号位 cmp dx, 0 ; 判断符号位是否为0 je no_extend4 ; 如果符号位为0,则无需进行符号扩展 mov ah, 0 ; 如果符号位为1,则将高16位设置为FFFF mov al, 0FFh mov dx, ax ; 将扩展后的符号位存储在dx中 no_extend4: imul bx ; 进行16位带符号乘法,结果存储在dx:ax中 add cx, dx ; 将两次乘法的结果相加,得到32位带符号乘积的高16位结果 ; 将结果存储在指定地址 mov [result+2], cx ; 存储高16位结果 mov [result], dx ; 存储低16位结果 ``` 需要注意的是,带符号乘法运算使用的是imul指令,而不是mul指令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值