《汇编语言》学习(十一)标志寄存器

来源:互联网 发布:贵州广电网络怎么缴费 编辑:程序博客网 时间:2024/04/30 14:13

    本章主要学习X86汇编语言中的各个标志寄存器及其作用。我将在本文用一张思维导图总结它的知识点,并给出所有的习题答案。

一、知识图谱


二、习题

检测点11.1

sub al,al    ZF=1,PF=1,SF=0        al=00000000bmov al,1     ZF=1,PF=1,SF=0        al=00000001bpush ax      ZF=1,PF=1,SF=0        al=00000001bpop bx       ZF=1,PF=1,SF=0        bl=00000001badd al,bl    ZF=0,PF=0,SF=0        al=00000010badd al,10    ZF=0,PF=1,SF=0        al=00001100bmul al       ZF=0,PF=1,SF=1        al=10010000b

这道题需要注意的是:

1)运算类的指令,如add、sub、mul、div、inc、dec、or、and等,它们会影响标志寄存器;而转移类的指令,如mov、push、pop不会影响标准寄存器。

2)SF记录的只是在计算机中存放的相应位数的结果的正负,不代表真正的结果正负。如al,只看第7位的值。


检测点11.2

sub al,al         CF=0,OF=0,SF=0,ZF=1,PF=1        al=00000000bmov al,10H        CF=0,OF=0,SF=0,ZF=1,PF=1        al=00000010badd al,90H        CF=0,OF=0,SF=1,ZF=0,PF=1        al=10100000bmov al,80H        CF=0,OF=0,SF=1,ZF=0,PF=1        al=10000000badd al,80H        CF=1,OF=1,SF=0,ZF=1,PF=1        ax=1 00000000bmov al,0FCH       CF=1,OF=1,SF=0,ZF=1,PF=1        al=11111100badd al,05H        CF=1,OF=1,SF=0,ZF=0,PF=1        ax=1 00000110bmov al,7DH        CF=1,OF=1,SF=0,ZF=0,PF=1        al=01111101badd al,0BH        CF=0,OF=0,SF=1,ZF=0,PF=1        al=10001000b

这道题除了需要同上一道题一样注意那两点外,还要考虑“进位或溢出”。此外,总结一下,不管是SF,还是ZF或PF,都只是存放相应位数的结果的正负。所以,这些标志寄存器,就单个而言,都是代表逻辑结果,不代表真实的结果。


检测点11.3

a.统计F000:0处32个字节中,大小在[32,128]的数据的个数

    mov ax,0f000h    mov ds,ax        mov bx,0    mov dx,0    mov cx,32  s:mov al,[bx]    cmp al,32    jb s0    cmp al,128    ja s0    inc dx s0:inc bx    loop s


b.统计F000:0处32个字节中,大小在(32,128)的数据的个数

    mov ax,0f000h    mov ds,ax        mov bx,0    mov dx,0    mov cx,32  s:mov al,[bx]    cmp al,32    jna s0    cmp al,128    jnb s0     inc dx s0:inc bx    loop s

    本题考察的是:cmp、标志寄存器的相关位、条件转移指令三者的配合应用。

注意:inc指令不改变标志寄存器。


检测点11.4

mov ax,0push axpopf                ;all flags are 0mov ax,0fff0hadd ax,0010h        ;result = 1 00000000 00000000bpushfpop ax              ;ax=0000 1000 0100 0101band al,11000101B    ;ax=0000 1000 0100 0101badd ah,11111000B    ;ax=0000 1000 0100 0101b


    ax=845H


实验11

编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转换为大写字母。

assume cs:codesgdatasg segment db "Beginner's All-purpose Symbolic Instruction Code.",0datasg endscodesg segment begin:mov ax,datasg       mov ds,ax       mov si,0       call letterc          mov ax,4c00h       int 21h   letterc:push si        push axsub ax,ax      s:mov al,[si]cmp al,0je okcmp al,61hjb s0cmp al,7ahja s0and al,11011111bmov [si],al     s0:inc sijmp s     ok:pop axpop si retcodesg endsend begin

说明:

1,本题考察多cmp指令、标志寄存器和条件转移指令的综合应用——确定字符的范围。

2,本题关于大小写转换的技术,可以参考第7章。

3,本题的测试字符串是“BASIC”的展开。



0 0