⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loop.txt

📁 一些小程序,关于汇编语言中程序的中断的使用,例子中包括字符输出
💻 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 + -