标签:
7.1 and 和 or 指令
二进制的and or 可以将某位归0或置1
7.2 关于ASCII码
7.3 以字符形式给出数据
data segment
db ‘unIX‘ //相当于db 75H,6EH,49H,58H
db ‘foRK‘ //相当于db 66H,6FH,52H,4BH
data ends
mov al,‘a‘ //相当于mov al,61H
7.4 大小写转换问题
db ‘BaSiC‘
db ‘iNfOrMaTiOn‘
如何将第一个字符串转成大写,第二个小写?
我们将ASCII码拿出来对比一下:
大写 十六进制 二进制 小写 十六进制 二进制
A 41 010000001 a 61 01100001
B 42 010000010 b 62 01100010
C 43 010000011 c 63 01100011
..... ........
易知:小写字母比大写字母大20H,二进制中即第五位(位从0开始)为1和0
由于我们没有条件判断的指令来+或—20H来改变大小写,所以在这里用and 和 or指令改变二进制第六位数值来达到目的:
assume cs:code,ds:data
data segment
db ‘BaSiC‘
db ‘iNfOrMaTiOn‘
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,5
s:
mov al,ds:[bx]
and al,11011111B //第一个循环,前5个内存单元第五位归0 变大写
mov ds:[bx],al
inc bx
loop s
mov cx,11
s2:
mov al,ds:[bx]
or al,00100000B //第一个循环,后11个内存单元第五位置1 变小写
mov ds:[bx],al
inc bx
loop s2
mov ax,4c00h
int 21h
code ends
end start
7.5 [bx+idata]
用bx+idata来更灵活的指定偏移地址,也可以写成 idata[bx]很方便的用于表示数组(起始位置在idata,索引在bx)
7.6 用[bx+idata]处理数组
assume cs:code,ds:data //C语言
data segment
db ‘BaSiC‘ //char a[5] = "BaSiC";
db ‘MinIX‘ // char b[5] = "MinIX";
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0 // int i = 0;
mov cx,5
s: //do{
mov al,ds:0[bx]
and al,11011111B // a[bx] = a[bx] & 0xdf
mov ds:[bx],al
mov al,ds:5[bx]
or al,00100000B // b[bx] = b[bx] | 0x20
mov ds:5[bx],al
inc bx // i++;
loop s //while (i < 5)
mov ax,4c00h
int 21h
code ends
end start
标签:
原文地址:http://www.cnblogs.com/superzhao/p/4636489.html