汇编语言程序设计——分支结构例3

汇编语言程序设计——分支结构例3

设计目标

从键盘输入一串字符,如果是数字存入 NUMB 单元,如果是字母,将大写字母存入 CAPI 单元,小写字母存入 LETT 单元,分别统计个数,输入回车时退出。

设计思路

(1)用 TEST 测试指令来区分数字和字母:

数字0-9的ASCII码:         30H~39H           00110000B~00111001B

大写字母A~Z的ASCII码:41H~5AH          01000001B~01011010B

小写字母a~z的ASCII码:61H~7AH           01100001B~01111010B

  • 数字和字母的第 6 位不同。因此,区别数字和字母用 TEST AL,40H; 第 6 位为 0 是数字,第 6 位为 1 则为字母。
  • 大小写字母为第 5 位不同。区别大小写字母用 TEST AL,20H; 第 5 位为 0 是大写字母,第 5 位为 1 则为小写字母。

(2)用 CMP 指令排除其它字符;

(3)数字、大写字母、小写字母的个数分别放在 DI、SI、BX 中。

5-3.asm

;5-3.asm  分支程序。区分和统计键入的数字、大写字母、小写字母
data segment
    numb db 10 dup(?)
    capi db 10 dup(?)
    lett db 10 dup(?)
data ends
code segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
let0: mov ah,1             ;键盘输入
    int 21h
    cmp al,0dh             ;回车?
    jz exit                ;是,转EXIT
    test al,40h            ;区分数字和字母
    jz let1                ;是数字,转LET1
    test al,20h            ;区分大小写字母
    jz let2                ;是大写,转LET2
    cmp al,7ah             ;排除不是小写字母
    ja exit
    mov lett[bx],al        
    inc bx                 ;小写个数加1 
    jmp let0
let2: cmp al,5ah           ;排除大小写之间的字符
    ja exit
    mov capi[si],al
    inc si                 ;大写个数加1        
    jmp let0
let1: cmp al,'0'           ;排除其它字符
    jb exit
    cmp al,'9'
    ja exit
    mov numb[di],al
    inc di                 ;数字个数加1
    jmp let0
exit: mov ah,4ch
    int 21h
code ends
end start

TEST 测试指令的用法:

TEST 指令将两个操作数做按位相与操作,结果不回送,但是改变了标志位。

例如:假设 AL=97H,要测试 AL 的第 3 位是否为 0;如果为 0,转移到 LET1 执行。指令为 TEST AL,08H。把数值转换成二进制:97H=10010111,08H=00001000。可看到,08H 只有第 3 位为 1,其余位都是 0,任何数和 08H 相与的结果只保留了第 3 位的值,其余为全部清 0。如果第 3 位上为 0,那么整个结果就为 0,否则结果不为 0,零标志 ZF 会相应地做出改变。这样,根据结果是否为 0 就可以进行分支转移了。

汇编语言程序设计——分支结构例3_第1张图片

你可能感兴趣的:(汇编语言)