(提示:回车符CR的ASCII码值为0DH;LF换行的ASCII码是0AH ;0-9的ASCII码值分别为30H-39H。)
正确的源程序应为如下语句: CODE
SEGMENT
ASSUME CS:CODE START: MOV AH,01H INT 21H CMP AL,33H JB START CMP AL,39H JA START SUB AL,30H MOV CL , AL
MOV CH,0 MOV DL,0DH
MOV AH , 02H
INT 21H MOV DL,0AH
INT 21H PUSH CX
AA:
BB: MOV DL,‘*’ MOV AH , 02H INT 21H
LOOP BB
MOV DL,0DH
INT 21H
93\\ 从内存存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。
汇编语言源程序如下:
21
DATA DATA STACK STACK CODE START:
SEGMENT ;定义数据段 BUF DB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,FFH ;定义数据区 CN EQU $-BUF ENDS
SEGMENT ;定义堆栈段 STA DB 10 DUP(?)
TOP EQU $-STA ENDS
SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK
PUSH DS ;汇编开始
XOR AX,AX ; 这条指令在程序中很常见,一般有两个功能(见备注)
PUSH AX
MOV AX,DATA
MOV DS,AX ;初始化DS MOV BX,OFFSET BUF MOV CX,CN DEC CX MOV AL,[BX] INC BX
LP: CMP AL,[BX] ;两数比较 JBE NEXT NEXT: CODE
备注:
MOV AL,[BX] INC BX DEC CX JNZ LP
MOV AH,4CH INT 21H ENDS
;若(AL)<[BX],转NEXT ;将较小数存入AL中
;返回DOS
1、将AX清零; 2、将CF标志位也清零。
也就是说相当于以下两条指令:
MOV ax,0 CLC可用AND AX,0之类的指令代替,不过XOR AX,AX指令比AND AX,0指令占存储空间要小,执行速度更快,因此更常用。 XOR AX,AX
XOR是异或操作符,它的输出规则为异则输1,否则输0,AX与AX8个位当然都是一样,即全部输出为0,同样也可达到AX清零目的.
不过现在一般书上都是用XOR AX,AX实现清零操作..因为在CPU中位操作指令是要比算术操作指令要快.
22
94、编制程序完成求1+2+3+??+N的累加和,直到累加和刚超过1000为止, 统计被累加
的自然数的个数送CN单元,累加和送SUM单元。
该题的循环次数预先是不确定的,只能按照循环过程中的某个特定条件来决定循环
是否继续执行。可通过测试条件是否成立来实现对循环的控制。 程序设计如下。
DATA SEGMENT SUM DW ? CN DW ? DATA CODE
ENDS SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,0 MOV BX,0 LP:
;初始化DS ;0送AX ;0送BX
INC BX ;BX加1
ADD AX,BX ;求累加和
CMP AX,1000
;比较
;结果≤1000转LP
JBE LP
MOV SUM,AX MOV CN,BX
;送结果
23
MOV AH,4CH INT 21H CODE
ENDS
;汇编结束 ;返回DOS
END START
95、大写字母转换为小写字母
编程要求:
从键盘读入一行长度不超过50个的用字符&结束的字符串。将其中的所有大写字母转换为小写字母,而保持其他字母不变,统计出需转换的字母的个数,并存放在rs单元中。
源程序如下: Data segment
BUF db 50 db ? db 50 dup( ?) rs db ? data ends code segment
assume cs:code,ds:data
start:
mov ax,data mov ds,ax
24
mov dx,offset BUF ;dx 指向字符串首地址 mov ah,0ah ;键盘输入到缓冲区 int 21h
xor dl,dl ;dl清零,计数清零
mov bx,offset BUF+2 ;取键入的第一个字符送bx
lop:
mov al,[bx] cmp al,’&’
jz stp cmp al,'a'
jb next cmp al,'z'
ja next add al,20h
inc dl next: inc bx
jmp lop stp:
mov rs,dl mov ah,4ch
int 21h
code ends
;等于’&’转stp ;小于'A'转next ;大于'Z'转next
; 大写字母的ASCII码加20h,则转换为小写字母 ;dl+1,计数加1
;(bx)+1送(bx) ; 转lop
;dl送rs ;返回DOS 25
end start ;运行结束
26