当前位置:编程学习 > 汇编语言 >>

汇编语言变量累加

我想在汇编语言中定义一个变量,在我执行完一段程序后,这个变量的值加1 就像c语言中的 i++语句一样。
答案:DATA SEGMENT
 INPUT DB 'INPUT NUM:','$'
 BUF DB 10
 N   DB ?
 CHAR DB 10 DUP(0)
 SUM DB 0
DATA ENDS
STACK SEGMENT STACK 
 DB 200 DUP(0)
STACK ENDS
CODE SEGMENT 
 ASSUME DS:DATA,CS:CODE,SS:STACK
START: MOV AX,DATA
 MOV DS,AX
 MOV DX,OFFSET INPUT
 MOV AH,9
 INT 21H

 MOV AH,2
 MOV DL,0AH
 INT 21H
 MOV DL,0DH
 INT 21H

 MOV DX,OFFSET BUF
 MOV AH,0AH
 INT 21H

 MOV SI,OFFSET CHAR
 MOV AL,0
 MOV CL,N
LOP: ADD AL,[SI]
 INC SI
 LOOP LOP
 MOV AH,4CH
 INT 21H

CODE ENDS
 END START
其他:;读入偶数字节至累加器AL(这条指令执行后,si自动增1) and [si],al ;为了改善汇编语言源程序的结构,减少显式转移语句所带来混乱,在宏汇编MASM 6 inc ax INC Code Segment 
Assume CS:Code,DS:Code 

s1 db 129,78,99,72,63,51,49,37,253,199 
Odd_Num equ 1 ;奇数 
Even_Num equ 0 ;偶数 
Parity equ Odd_Num ;相与结果存于奇数字节 

Start: push cs 
pop ds 
push cs 
pop es ;使数据段、附加段与代码段同段 

cld 
lea si,s1 ;变量s1首地址装入源变址寄存器si 
mov cx,5 ;循环次数(10个字节,两两相与,循环5次) 
.IF Parity==Odd_Num ;若把相与结果存于奇数字节 
L1: lodsb ;读入偶数字节至累加器AL(这条指令执行后,si自动增1) 
and [si],al ;相与的结果存于奇数字节 
inc si ;准备处理后面的两个字节 
loop L1 
.ELSEIF Parity==Even_Num ;若把相与结果存于偶数字节 
L2: inc si ;si增1,准备读取奇数字节 
lodsb ;读入奇数字节至累加器AL 
and [si-2],al ;相与的结果存于偶数字节 
loop L2 
.ENDIF 

Exit_Proc: mov ah,4ch ;结束程序 
int 21h 

Code ENDS 
END Start ;编译到此结束 


用伪指令实现分支结构 

为了改善汇编语言源程序的结构,减少显式转移语句所带来混乱,在宏汇编MASM 6.11系统中,增加了表达分支结构的伪指令。该伪指令的书写格式与高级语言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。理解并掌握该知识,对将来学习《编译原理》课程也有一定的帮助。 

分支伪指令的具体格式如下: 

格式1: 

.IF condition ;以英文“句号”开头 
指令序列 ;条件"condition"成立时所执行的指令序列 
.ENDIF 

格式2: 

.IF condition 
指令序列1 
.ELSE 
指令序列2 ;条件"condition"不成立时所执行的指令序列 
.ENDIF 

格式3: 

.IF condition1 
指令序列1 
.ELSEIF condition2 
指令序列2 ;条件"condition2"成立时所执行的指令序列 
.ENDIF 

其中:条件表达式“condition”的书写方式与C语言中条件表达式的书写方式相似,也可用括号来组成复杂的条件表达式。 

条件表达式中可用的操作符有:==(等于)、!=(不等)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、&(位操作与)、!(逻辑非)、&&(逻辑与)、||(逻辑或)等。 

若在条件表达式中检测标志位的信息,则可以使用的符号名有:CARRY?(相当于CF==1)、OVERFLOW?(OF==1)、PARITY?(PF==1)、SIGN?(SF==1)、ZERO?(ZF==1)等。例如: 

.IF CARRY? && AX != BX ;检测CF==1且AX!=BX是否成立 
;汇编语言指令序列 
.ENDIF 

在指令序列中,还可再含有其它的.IF伪指令,即:允许嵌套。伪指令.ELSEIF引导出另一个二叉分支,但它不能作伪指令块的第一个伪指令。 

汇编程序在对“条件表达式”进行代码转换时将进行代码优化处理,以便尽可能生成最好的指令代码。如: 

.IF ax == 0 

汇编程序会把它转换为指令“OR ax, ax”,而不是“CMP ax, 0”,因为前者比后者更好,而不是简单直接地转换为后者。



 

上一个:intel ia32有没有讲汇编语言的国际巨著或经典书籍?我们的教材是钱晓捷的,感觉写的有点乱。
下一个:汇编指令:mov word [LABEL_DESC_CODE32 + 2], ax,其中LABEL_DESC_CODE32 + 2是什么意思?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,