鱼C论坛

 找回密码
 立即注册
查看: 2630|回复: 4

[汇编作业] 第11章检测实验及笔记

[复制链接]
发表于 2016-1-12 11:54:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
图是个帮助记忆的好东西,做成桌面天天看。

asdf.png

评分

参与人数 1鱼币 +5 收起 理由
康小泡 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-12 15:23:42 | 显示全部楼层
本帖最后由 yundi 于 2016-1-15 08:54 编辑

做题时觉得模糊的地方:
1.
mov al,11111111b
add al,1
错答:结果是100000000b,所以PF=0(结果有1个1),ZF=0(结果不为0)。
正解:结果指的是al中的值,00000000b,所以PF=1,ZF=1,进位改变CF的值。

2.书中提到CF、OF易混淆,果然做题时出错,用自己的理解讲一次
CF进位标志:很容易理解,add al,bl ,没有符号位,al,bl8位全参与运算,结果超过8位时,CF标为1
OF溢出标志:同样是add al,bl,但al,bl的最高位表示符号,不参与运算,那么就有一种情况,al+bl的次高位向最高位(符号位)进位,导致结果超出能表示的范围,这种情形称为溢出,OF标为1
举个栗子:
mov al,01000000
add al,01000001
当成是无符号,即64+65=10000001b,没有进位,所以CF=0;
但若是有符号,即(+64)+(+65)=10000001b=129?(-127)?,因为次高位向最高位(符号位)进位,结果超出范围,溢出,所以OF=1

3.计算机是如何知道溢出的,没想明白,最后百度到一个结果:
最高位进位值 XOR 次高位进位值 = 1 则 溢出,即最高位、次高位不是同时进位的,就是溢出。

下面是自己之前的思考过程,先留着,方便以后查看:
3.还是OF问题????
mov al,01111111b
mov bl,11111111b
sub al,bl
有符号数,人可以思考是127-(-1)=128,溢出了.但计算机如何知道是溢出了?它会知道自己的表示范围是-128~127,然后还会计算是否超出范围?
如果按位相减,除了符号位,其它都正好相减为0,溢出如何判断?
假设是看是否向最高位借位,那么下例
mov al,00111111b
mov bl,11111111b
sub al,bl
OF=1,但实际未溢出,OF=0。
我觉得可能是将减法转换成了加法然后,通过次高位进位来判断超出范围
mov al,01111111b;例1
mov bl,00000001b
add al,bl;OF=1
mov al,00111111b;例2
mov bl,00000001b
add al,bl;OF=0
晕了,上面的猜测还是错的
mov ax,0fff0h
add ax,0010h
次高位也进了位,但没溢出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-13 15:18:51 | 显示全部楼层
本帖最后由 yundi 于 2016-1-14 14:46 编辑

有意思的cmp指令,通过它修改标志位,配合je,jne,jb,jnb,ja,jna,让计算机有了“逻辑思维”。书上有详细说明,自己再推导一遍,加深印象。
cmp al,bl之后,根据标志位的值可以作出如下判断:
1.
    ZF=1 =>(al)-(bl)=0 =>必然al=bl,无论有无符号也不管其它标志位多少
    ZF=0 =>(al)-(bl)!=0 =>必然al!=bl
2.1
    CF=1=>有进借位,必然ZF=0,al!=bl。
    如果是无符号的则必然(al)<(bl)。
    如果是有符号的呢?①0xxxxxxx - 1xxxxxxx 有借位,(al)>(bl) ②1xxxxxxx-0xxxxxxx无借位,(al)<(bl)③10xxxxxx-11xxxxxxe 有借位,10111111b(-65)<11111111b(-1),所以有符号的要另想办法。也正印证书上那句:CF是对无符号数运算有意义的标志位!
2.2
    CF=0=>无进借位,分两种:ZF=0和ZF!=0,一种必然(al)=(bl),另一种必然(al)>(bl),也就是说单看CF=0 则必然 (al)>=(bl)。
3.分析有符号的看OF和SF
3.1 OF=0 SF=1
3.2 OF=0 SF=0
    OF=0不溢出说明结果是准确结果,SF=1结果为负,则是小数-大数,必然(al)<(bl); SF=0结果为非负(不是为正),必然(al)>=(bl)
3.3 OF=1 SF=1
3.4 OF=1 Sf=0
    OF=1溢出,说明结果不准确,正负与真实正好相反(这个结论凭感觉,没证明,有点心虚),所以SF=1时(al)>(bl),SF=0时(al)<(bl)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 10:06:24 | 显示全部楼层
本帖最后由 yundi 于 2016-1-15 10:08 编辑

本章的实验题,写一个子程序,将0结尾的字符串中小写字母转为大写。觉得比前面的练习简单多了。
assume cs:codesg
datasg segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends

codesg segment
begin:
                mov ax,datasg
                mov ds,ax
                mov si,0
                call letterc
                                
                mov ax,4c00h
                int 21h
                
letterc:
                push cx
                xor ch,0
s1:
                mov cl,byte ptr ds:[si]
                jcxz ok;cx=0跳出循环并返回
                ;这里判断ascii范围
                ; 97<=cl<=122转换为大写
                ;小于97跳下次循环
                cmp cl,97
                jb next
                ;大于122跳下次循环
                cmp cl,122
                ja next
                ;期间的转换,某位置0
                and cl,11011111b
                mov byte ptr ds:[si],cl
                
next:        inc si
                jmp short s1        
                
ok:                pop cx
                ret
codesg ends
end begin
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-2 12:49:05 From FishC Mobile | 显示全部楼层
说得好好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 18:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表