📄 loop.txt
字号:
例:现有一个以$结尾的字符串,要求剔除其中的空格
.data
string db ’Let us have a try !’,’$’
.code
.startup
mov si,offset string
outlp: cmp byte ptr [di],’$’ ;外循环,先判断后循环
jz done ;为$结束
cmp byte ptr [si],’ ’ ;检测是否是空格
jnz next ;不是空格继续循环
mov di,si ;是空格,进入剔除空格分支
;该分支是循环程序段
inlp: inc di
mov al,[di] ;前移一个位置
mov [di-1],al
cmp byte ptr [di],’$’ ;内循环,先循环后判断
jnz inlp
jmp outlp
next: inc si ;继续对后续字符进行处理
jmp outlp
done: .exit 0 ;结束
end
例:假设在以TAB为首址的字节存储区中,存放着n 个学生汇编语言的期末考试成绩。
其中学号顺序是随机的。现需要在表中查找某个学号对应的汇编语言成绩,若查找成功,
则将该学号的偏移地址送SI,对应成绩送DH寄存器,并将字节变量FLAG置1;
否则将FLAG清0,表示查询失败。
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT
TAB DB 5,90,8,75,2,80,6,78,15,84,3,95,12,86,20,92
N = ($ - TAB)/2 ;表TAB中的总项数
NUM DB 6 ;要查找6号学生的成绩信息
FLAG DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX,DATA
MOV DS,AX
LEA BX,TAB ;BX←TAB的偏移地址
MOV CX,N ;CX←N
MOV AL,NUM ;AL←待查找的学号
NEXT: CMP AL,[BX]
JE DONE ;(AL)=([BX]),查找成功转DONE
ADD BX,2 ;否则BX增2,指向下一项
DEC CX ;CX ←(CX)﹣1
JNE NEXT ;(CX)≠ 0,继续查找
MOV FLAG,0 ;否则FLAG←0,查找失败
JMP EXIT
DONE: MOV SI,BX ;SI←已找到学号在表中的偏移位置
MOV DH,[BX+1] ;DH←对应的成绩
MOV FLAG,1 ;FLAG←1,表示查找成功
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
例:统计字单元number中二进制数位值为1的个数,统计结果存放在变量one中。
; 定义数据段
data segment
number dw 1669H
one db 0
data ends
; 定义代码段
code segment
assume cs:code, ds:data
start:
mov ax,data
mov ds,ax ; 把数据段段地址送ds
mov ax,number ; 把number送ax
compa:
cmp ax,0 ; (ax)=0?
jz finish ; 为零则退出
shl ax,1 ; 把ax左移1位
jnc compa ; cf为0则跳转
inc one ; cf为1则one加1
jmp compa ; 循环
finish:
mov ax,4c00h
int 21h
code ends
end start
例:将正数N插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有数均为正数且已按递增的次序排列。
; 定义数据段
datarea segment
x dw ?
array_head dw 23,37,49,52,65,78,99
array_end dw 105
n dw 32
datarea ends
; 定义代码段
prognam segment
assume cs:prognam,ds:datarea
start: ; 程序从此处开始执行
mov ax,datarea
mov ds,ax
; 程序的主要部分
mov ax,n
mov array_head-2,0ffffh ; -1送array_head-2单元
mov si,0
compare: cmp array_end[si],ax
jle insert
mov bx,array_end[si]
mov array_end[si+2],bx
sub si,2
jmp short compare
insert: mov array_end[si+2],ax
mov ah,4ch
int 21h
prognam ends
end start
例:有一个首地址为A的N字数组,请编制程序使该数组中的数按照从小到大的次序整序。
dseg segment
n equ 5 ; 数组中数的个数
a dw n dup(?)
dseg ends
; 定义代码段
cseg segment
assume cs:cseg, ds:dseg
start:
mov ax,dseg
mov ds,ax
mov cx,n
dec cx ; 设置count1
loop1: mov dx,cx ; 保存count1
mov si, 0 ; 初始化si
loop2: mov ax,a[si]
cmp ax,a[si+2] ; Ki与Ki+1比较
jle num ; 如果Ki≤Ki+1,不交换
xchg ax,a[si+2]
mov a[si],ax ; 如果Ki>Ki+1,交换
num: add si,2 ; 修改地址
loop loop2 ; 内循环
mov cx,dx ; 恢复count1
loop loop1 ; 外循环
mov ax,4c00h
int 21h
cseg ends
end start
mov cx,count ;CX←数组元素个数
dec cx ;元素个数减1为外循环次数
outlp: mov dx,cx ;DX←内循环次数
mov bx,offset array
inlp: mov al,[bx] ;取前一个元素
cmp al,[bx+1] ;与后一个元素比较
jna next
;前一个不大于后一个元素,则不进行交换
xchg al,[bx+1] ;否则,进行交换
mov [bx],al
next: inc bx ;下一对元素
dec dx
jnz inlp ;内循环尾
loop outlp ;外循环尾
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -