汇编程序——循环与分支结构

时间:2021-03-24 00:54:37

这是我学习汇编语言循环与分支结构的过程中总结的一些代码。

其中有参考我们老师的课件和清华大学出版社的《IBM—PC 汇编语言程序设计》。

仅供学习参考!禁止转载!


【例1】编程将内存数据段字节单元INDAT存放的一个数n(假设0≤ n ≤9 ),以十进制形式在屏幕上显示出来。

例如,若INSTR单元存放的是数8,则在屏幕上显示:8D。

思路:首先需要数据段里定义一个DB类型的10进制数,然后初始化寄存器,取操作数,将他转化为ASCII码,再利用2号DOS功能,显示字符‘D’。

代码:

DATA  SEGMENT   		;数据段定义
    INDAT  DB 8
DATA  ENDS
CODE  SEGMENT     	;代码段定义
   ASSUME CS:CODE,DS:DATA
START:  MOV  AX,DATA
        MOV  DS,AX 	;初始化DS
	MOV  DL,INDAT   
       	OR  DL,30H
       	MOV  AH,2
       	INT  21H
       	MOV  DL,'D'
        MOV  AH,2
       	INT  21H
	MOV  AH,4CH   ;返回DOS窗口
       	INT  21H                              
CODE  ENDS
      END  START

【例2】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。

代码:

data segment
 res dw ?
data ends
code segment
 assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax
	mov ax,9a00H
	cmp ax,0
	jge isp
	neg ax
isp:	mov res,ax
	
	mov ah,4ch
	int 21h
code ends
  end start

【例3】编程判断DAT单元存放的带符号数的正负。
如该数为负数,则显示“DAT is a negative number!”;否则显示“DAT is a nonnegative number!”。

代码:

DATA  SEGMENT       		;数据段定义
  N  DB  'DAT is a negative number!','$'
  NN  DB 'DAT is a nonnegative number! $'
DATA  ENDS
CODE  SEGMENT        		;代码段定义
   ASSUME CS:CODE,DS:DATA
START: 
   	    MOV  AX,DATA
   	    MOV  DS,AX       	;设置DS
	    MOV  AX,-3
	    CMP  AX,0
	    JGE  ISNN
   	    LEA  DX,N
	    MOV  AH,9
	    INT  21H
	    JMP  FINISH
ISNN: 	    LEA  DX,NN
	    MOV  AH,9
	    INT  21H
FINISH:
	    MOV  AH,4CH
	    INT  21H
CODE   ENDS
    	END  START

【例4】  编程求分段函数Y的值。已知变量X为16位带符号数,分段函数的值要求保存到字单元Y中。

函数定义如下:当x=0时,Y=0,当x大于0时,Y=1,当x小于0的时候,Y=-1。

代码:

DATA  SEGMENT   ;数据段定义
   X  DW  -128
   Y  DW  ?
DATA  ENDS
CODE  SEGMENT  ;代码段定义
   ASSUME CS:CODE,DS:DATA
START:  MOV  AX,DATA
     	MOV  DS,AX 
	MOV  AX,X
     	CMP  AX,0
      	JG  ISPN
   	JZ  ISZN
      	MOV  Y,-1
     	JMP  FINISH
ISPN:	MOV  Y,1
      	JMP  FINISH
ISZN:	MOV  Y,0	
FINISH:	MOV  AH,4CH
	INT  21H
CODE	ENDS
      	END  START


【例5】  编程显示以“!”结尾的字符串。
如:“Welcome to MASM!”。

代码:

DATA  SEGMENT            
   MYSTR  DB  'Welcome to MASM!'
DATA  ENDS
CODE  SEGMENT                 
   ASSUME CS:CODE,DS:DATA
START: 
	MOV  AX,DATA      	
	MOV  DS,AX
        LEA  SI,MYSTR
next:
	mov dl,[si]
	cmp dl,'!'
	jz finish
	mov ah,2
	int 21h
	inc si
	jmp next
finish:
	mov dl,'!'
	mov ah,2
	int 21h
	mov ah,4ch
	int 21h
code ends
     end start

【例6】  将内存数据段INSTR地址开始存放的一个由字母组成的字符串中的小写字母全部转换成大写字母(其余字符不变)后存至内存数据段OUTSTR地址处。
如原字符串是“welcome to MASM!”,那么转换完后应该是“WELCOME TO ASM!”。

代码:

DATA   SEGMENT               
	INSTR  	 DB  'welcome to MASM!'
	STRLEN	 EQU  $-INSTR      
	OUTSTR 	 DB   STRLEN DUP(?),13,10,’$’
DATA    ENDS
CODE    SEGMENT                 
   		ASSUME CS:CODE,DS:DATA
START: 
	MOV  AX,DATA
	MOV  DS,AX
 	LEA  SI,INSTR
	LEA  DI,OUTSTR
	MOV  CX,STRLEN
NEXTCHAR:
	MOV  AL,[SI]
	CMP  AL,'a'	
	JB  UNCHG	;不是小写字母,则不转换
	CMP  AL,'z'
	JA  UNCHG	;不是小写字母,则不转换
	SUB  AL,20H	;将小写字母转换为大写字母
UNCHG:	
	MOV	[DI],AL
	INC  SI
	INC  DI
LOOP  NEXTCHAR
	MOV  AH,4CH
	INT  21H
CODE    ENDS
	END     START