汇编程序——循环与分支结构
2016-11-30 16:18
2271 查看
这是我学习汇编语言循环与分支结构的过程中总结的一些代码。
其中有参考我们老师的课件和清华大学出版社的《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
其中有参考我们老师的课件和清华大学出版社的《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
相关文章推荐
- JAVA入门.零基础学Java语言 MOOC 第二 第三 第四周 比较 判断 分支 循环 —————— 程序控制结构(顺序,分支,循环)
- 在多个服务器跑程序经验之批处理顺序、分支、循环结构
- C语言_04 三种程序结构 顺序, 选择(分支), 循环结构
- 对汇编中循环程序结构的认识
- 实验 3 简单的分支与循环结构 第一题 编写求圆面积的程序,要求当输入的半径r<=0时,提示输入错误,要求r为浮点型,r的数值是动态的由键盘输入
- java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)
- 循环控制结构程序05 - 零基础入门学习C语言20
- 循环控制结构程序06 - 零基础入门学习C语言21
- 循环控制结构程序05 - 零基础入门学习C语言20
- 判断与分支的汇编结构
- Win32汇编教程二 Win32汇编程序的结构和语法
- 循环控制结构程序07 - 零基础入门学习C语言22
- 循环控制结构程序02 - 零基础入门学习C语言17
- 循环控制结构程序04 - 零基础入门学习C语言19
- 循环控制结构程序04 - 零基础入门学习C语言19
- 09c语言学习资料 二、顺序结构,分支结构,循环结构
- Win32汇编教程二:Win32汇编程序的结构和语法
- 使用结构、数组、循环和DataGridView写的分数统计小程序
- Win32汇编笔记-内存管理,和跳转,分支,循环指令
- 汇编程序的结构——Hello World !