逻辑运算指令
    1.逻辑与and
    and dest,src 目的操作数:寄存器和存储单元 源操作数:立即数、寄存器、存储单元 (不能都是存储器操作数) and指令设置标志 CF=OF=0
    2.逻辑或or
    or dest,src 同and
    3.逻辑非not
    not是单操作数指令 求反 支持的操作数是寄存器和存储单元 不影响标志位
    4.逻辑异或xor
    xor dest,src 同 and or
    书上例题用到了 call dispbd 作用是 显示32位二进制数 (例题简单不再记录)
    5.测试指令test
    test dest,src ;将dest和src 进行逻辑与运算
    test指令不返回逻辑与的结果,只根据结果设置状态标志(and设置标志CF=OF=0 test只希望设置标志但是不希望改变源操作数的情况)


    移位指令
    1.移位指令
    SHL reg/mem,18/CL ;逻辑左移:reg/mem左移i8/CL位,最低位补0,最高位进入CF
    SHR reg/mem,18/CL ;逻辑右移:reg/mem右移i8/CL位,最高位补0,最低位进入CF
    SAL reg/mem,18/CL ;算术左移:同SHL
    SAR reg/mem,18/CL ;算术右移:reg/mem右移i8/CL位,最高位不变,最低为进入CF
    根据最高位或者最低位的移出设置CF,根据移位后的结果影响SF,ZF,PF,如果进行1位移动,则按照操作数的最高符号位是否改变相应设置溢出标志OF:如果移位前与移位后的最高位不同,则OF=1,否则OF=0,当移位次数大于1时,OF不确定
    IMG_20210422_17 的3  是148.jpg

    移位指令实现乘法程序
    ;eg3.14.asm in windows Console include io32.inc
    .data
    wvar word 34000
    .code
    start:
    xor eax,eax ;xor 异或指令,相异为1,所以eax=0
    mov ax,wvar ;ax=wvar

    shl eax,1 ;eax左移1位 相当于乘2
    mov ebx,eax ; ebx=eax
    shl ebx,2 ;ebx左移2位 相当于乘4 即ebx=eax8
    add eax,ebx ;相加 eax=eax
    10
    call dispuid ;显示乘积
    call dispcrlf ;换行
    imul eax,10 ;乘法指令
    call dispuid ;显示 进行验证
    exit 0
    end start
    image.png
    image.png

    2.循环移位指令
    ROL:不带进位循环左移指令
    ROR:不带进位循环右移指令
    RCL:带进位循环左移指令
    RCR:带进位循环右移指令
    循环移位指令的操作数形式与移位指令相同,按照指令功能设置进位标志CF,但不影响SF、ZF、PF标志。对OF的影响同前

    IMG_202104啊22_193吧739.jpg

    循环移位程序

    ;eg3.20.asm in windows Console include io32.inc
    .data
    qvar qword 1234567887654321h
    ascii byte ‘38’ ;十进制3对应十六进制33 十进制8对应十六进制38
    bcd byte ?
    .code
    start:
    mov ecx,4
    again:
    shr dword ptr qvar +4,1 ;逻辑右移1位 高32位(+4)
    rcr dword ptr qvar,1 ;带进位循环右移1位 低32位
    loop again

    mov al,ascii ;al=33H
    and al,0fh ;33H与0fH与运算 即00110011 00001111相与 即al=00000011
    mov ah,ascii+1 ;ah=38H 00111000B
    shl ah,4 ;ah逻辑左移4位 ah=10000000
    or al,ah ;00000011 10000000进行或运算 al=10000011B=83H
    mov bcd,al ;bcd=al
    call disprd
    exit 0
    end start

    image.png