当前位置: 汇编教程 > 03-指令系统 > 阅读正文

汇编 位运算

2021.7.11.   552 次   1214字

汇编可以使用and和or等指令, 进行位运算

  • and ==> 位与
  • or ==> 位或
  • not ==> 按位取反
  • xor ==> 按位异或
  • shl ==> 位左移
  • ……

位运算实例

1.位与运算实例

将al的第6位设为0:

and al, 10111111B

这里的位数从0开始,

因为仅有1与1相与, 结果才为1, 这里设置为0, 则与运算后一定为0

2.位或运算实例

将al的第6位设置为1:

or al, 01000000

第6位指的是右边从0开始数的第6, 把它设置为1, 则无论它相或的是什么值, 结果都一定为1

汇编字符表示

在汇编中, 字符编码支持的是ASCII, 而不是gbk, 或者unicode

如果想表示字符a, 则应该找到a对应的ASCII编码数值,

以字符形式给定数据

assume ds:data
data segment
    db 'unIX'
    db 'foRK'
data ends
code segment
start:
    mov al, 'a'
    mov ax, 4c00h
    int 21h
code ends
end start

在这里, db是定义字节型数据, 而ASCII是8位的, 刚好对应一个字节, 使用dw会浪费

在这里的一串字符, 比如 db ‘unIX’, 会被自动转换为 db 75H, 6EH, 49H, 58H,

在编写一串字符时, 应该使用单引号括起来, 若写的是16进制则没有这个引号但数据之间有逗号

字母大小写转换

查看下面的ASCII与二进制数据表, 找到大小写转换规律

大写二进制小写二进制
A01000001a01100001
B01000010b01100010
Z01011010z01111010

在这个表中, 发现大写与小写之间, 仅有第5位不同, 大写为0, 小写为1

我们利用and, or指令就可以完成对大小写的转换

assume cs:code, ds:data

data segment
    db 'BaSiC'
    db 'iNfOrMaTiOn'
    db '$'
data ends

code segment
start:
    mov ax, data    ; 把ax指向data段地址
    mov ds, ax
    mov bx, 0       ; 指向第一个字符
    mov cx, 5       ; 因为有5个字母, 循环5次
    s:
        mov al, [bx]
        and al, 11011111b  ; 把第5位转设置为0, 变为大写
        mov [bx], al
        inc bx       ; bx+1, 指向下一个字符
        loop s
    mov bx, 5       ; 指向第二个字符串的第一个字母,
    mov cx, 11      ; 因为有11个字母
    s0:
        mov al, [bx]
        or al, 00100000b   ; 变为小写
        mov [bx], al
        inc bx
        loop s0
    lea dx, ds:[0]
    mov ax, 0900h
    int 21h
    mov ax, 4c00h
    int 21h
code ends
end start

上述代码, 实现了将第一个字符串全部大写, 第二个字符串全部小写,

在此程序中, inc bx是将bx的值自增1, 此外, 这个程序需要严格计算字符串的长度, 在ds中存放的内存地址, 从0开始, 而db是一个字节, 第一个字符串长度为5, 所以第二个字符串是以5开始

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群