1、汇编语言的源代码格式
data segment ;定义数据段
x dw 0123h,0456h
y dw 0789h,0abch
z dw 0defh,0fedh
w dw 0cbah,0987h
data ends
stack segment stack ;定义堆栈段
dw 0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
assume cs:code,ds:data,ss:stack ;对数据段、堆栈段、代码段进行声明
start:mov ax,data
mov ds,ax ;让ds寄存器指向data段
mov ax,stack
mov ss,ax ;让ss寄存器指向stack段
mov sp,20h ;设置栈顶SS:SP指向stack:20
mov bx,0 ;ds:bx指向data段中的第一个单元
;--------------------------------------------------------------
;根据要求编写代码开始
mov cx,8
s: push [bx]
add bx,2
loop s ;以上将data段中的0~15单元中的8个字型数据依次入栈
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0 ;以上依次出栈8个字型数据到data段中的0~15单元中
;根据要求编写代码结束
;-------------------------------------------------------------
mov ax,4c00h ;AH=4ch
int 21h ;dos中断调用( int 21h )--返回
code ends
end start
2、根据字节中位的不同跳转至不同处理程序的例题
要求测试在STATUS中的一个字节,如果第1、3、5位均为1则转移到ROUTINE_1;如果此三位中有两位为1则转移到ROUTINE_2;如果此三位中只有一位为1则转移到ROUTINE_3;如果此三位全为0则转移到ROUTINE_4。试画出流程图,并编制相应的程序段。
答:程序段如下:
MOV AL, STATUS
AND AL, 00010101B ;只保留第1、3、5位
JZ ROUTINE_4 ;3位全为0转ROUTINE_4
JPE ROUTINE_2 ;两位为1转ROUTINE_2
CMP AL, 00010101B
JZ ROUTINE_1 ;3位全为1转ROUTINE_1
ROUTINE_3: ┇ ;仅一位为1执行ROUTINE_3
JMP EXIT
ROUTINE_1: ┇
JMP EXIT
ROUTINE_2: ┇
JMP EXIT
ROUTINE_4: ┇
EXIT: INT 20H
3、累加和程序题
编写 100+98+…..+2 的累加和程序并调试通过,并记录程序执行结束后CX的值是多少?
DATA SEGMENT
SRC DW 64H
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START: MOV AX,DATA
MOV DS, AX ;DS指向DATA
MOV BX, OFFSET SRC
MOV AX, [BX] ;初始化AX,CX
MOV CX,0064H
MOV DX,0
LOP: ADD DX,AX ;每减二就
SUB AX,2 ;加到DX,DX中存放最终结果
LOOPNZ LOP ;当ax减为零时结束循环
MOV AX,4C00H
INT 21H
CODE ENDS
END START
4、字符串的复制与查找
- 把从LIST 到LIST+316中的字符串传送到BLK到BLK+316 中去;
- 在BLK到BLK+100中查找字符“CQU”字符串,并记下“CQU”字符串出现的起始位置到BX中。
说明,LIST 到LIST+100的内容(from:http://study.cqu.edu.cn/IndexOfEnglish/Index)为:
Chongqing University (CQU) is a key national university and a member of the “Excellence League”, located in Chongqing, Southwest China. It is also one of the “211 Project" and "985 Project” universities with full support in construction and development from the central government and Chongqing Municipal Government.
DATA SEGMENT
LIST DB 'Chongqing University (CQU) is a key national university and a member of '
DB ' one of the “211 Project" and "985 Project” universities with full support in'
DB ' construction and development from the central government and Chongqing'
DB 'Municipal Government.$'
DATA ENDS
EXTRA SEGMENT
BLK DB 316 DUP(?)
EXTRA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:EXTRA
START:MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
MOV CX,316 ;设置复制的循环次数
LEA SI,LIST
LEA DI,BLK
CLD
REP MOVSB ;复制完毕
MOV CX,100 ;设置查找的次数
LEA DI,BLK
MOV AL,'C'
MOV AH,'Q'
MOV DL,'U'
LOP: CLD
REPNE SCASB ;查找与'C'匹配
JZ MATCHC ;若匹配则跳转到检查‘Q’
MATCHC: CMP BLK[DI],AH ;检查下一个是否为'Q'
JZ MATCHQ ;是,则跳转到检查'U'
JNZ LOP ;否,则继续检查下一个‘C'
MATCHQ: INC DI ;下下一个是否为'U'
CMP BLK[DI],DL
JZ MATCH ;是,则结束检测,记录位置
JNZ LOP ;否,则继续检查下一个‘C'
MATCH: DEC DI
DEC DI ;由于DI增加两次,所以起始位置需要减小两次
MOV BX, DI
MOV AX,4C00H
INT 21H
CODE ENDS
END START
4、起泡排序例题
- 在缓冲区中输入20字符,然后按ASCII值从大到小的顺序排列并显示出来。
要求:
(1)显示时每个字符间隔一个空格;
(2)换行后再将其中的数字按序显示出来。
datarea segment
buffer dw 20 dup(?)
tip db 'A 20-length string:','$' ;提示字符,提示用户输入
datarea ends
program segment
assume cs:program,ds:datarea
start:
;set DS register to current data segment
mov ax,datarea
mov ds,ax
mov dx,offset tip ;将串的段内地址装入DX
mov ah,09h ;在屏幕上输出提示用户输入的字符
int 21h
;输入字符
lea bx,buffer
mov cx,20 ;输入字符限定为20
input: mov ah,01 ;此处开始循环输入字符
int 21h
mov [bx],al
add bx,2
loop input
;起泡排序,由大到小
mov cx,20
dec cx
loop1: mov di,cx ;外层循环
mov bx,0
loop2: mov al,buffer[bx] ;内层循环
cmp al,buffer[bx+2]
jge continue ;如果前一个大于等于后一个,则不交换
xchg ax,buffer[bx+2]
mov buffer[bx],ax
continue: add bx,2
loop loop2
mov cx,di
loop loop1
;换行以便输出排序后的字符串
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,2
int 21h
;输出排序后的字符串
mov cx,14h ;字符串长度为20
mov bx,0 ;buffer的索引
print: mov dl,byte ptr buffer[bx]
mov ah,02h ;将相应字符输出到屏幕上
int 21h
mov dl,20h ;输入空格
mov ah,02h
int 21h
add bx,2 ;索引更新到下一个
loop print
;换行以便输出字符串中的数字
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,2
int 21h
;输出字符串中的数字
mov cx,14h
sub bx,bx ;更新索引至0,为字符串开头
num: mov ax,buffer[bx]
sub ax,30h ;数字的asc2码介于30h--39h
js next ;该字符的码值若小于30h,则跳转
sub ax,09h ;字符为数字
jns next ;字符不为数字则跳转
mov dl,byte ptr buffer[bx] ;输出数字
mov ah,02h
int 21h
next: add bx,2
loop num
mov ax,4c00h
int 21h
program ends
end start
5、双重循环比较两整数数组之间的内容并输出不同的整数
已知数组A包含15个互不相等的整数,数组B包含10个互不相等的整数。试编制一程序,把既在A中又在B中出现的整数存放于数组C中。然后将数组C逐个显示出来。
;***********************************************
datarea segment
A dW 0020h,0030h,0040H,0050H,0060H,0070H,0080H,0090H,0010H,0230H,0340H,0450H,0560H,0670H,0780H
B dW 0020h,0030h,0040H,0050H,0060H,0002H,0003H,0004H,0005H,0006H
C dW 10 DUP(?)
datarea ends
;***********************************************
program segment
main proc far
assume cs:program, ds:datarea
start:
;set up stack for return
push ds ;save old data segment
sub ax,ax ;put zero in AX
push ax ;save it on stack
;set DS register to current data segment
mov ax,datarea
mov ds,ax
;MAIN PART OF PROGRAM GOES HERE
mov bx,0
mov si,0
mov di,0
mov cx,150
next: mov ax,b[si] ;先以bx中第i个为中心
cmp ax,a[bx] ;将每一个ax中元素与之比较
je found
add bx,2
cmp bx,30
je add_dx ;若bx=30,则bx中某一元素已经遍历过ax所有元素
loop next
add_dx:
add si,2 ;si+2则指向bx下一个元素
mov bx,0
loop next
found:
mov c[di],ax
add di,2
add bx,2
cmp bx,30 ;检查是否遍历到ax最后一个元素
je add_dx
loop next
;打印出C中的内容
mov ax,0
mov al,si
div al,2
mov cx,ax ;C中元素个数
print: mov dx,c[si]
mov ah,02h
int 21h
mov dl,20h
mov ah,02h
int 21h
add si,2
loop print
ret
main endp ;end of main part of program
mov ax,4c00h
int 21h
program ends ;end of code segment
end start
6、XCHG指令的应用--加密表
编写一个程序,接受从键盘输入的10个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用XLAT指令变换)存入内存缓冲区BUFFER。加密表为:
输入数字:0,1,2,3,4,5,6,7,8,9
密码数字:7,5,9,1,3,6,8,0,2,4
;*********************************************
datarea segment
tip db 'Please input a 10-length number: ','$'
ary dw 10 dup(?)
pwd db 7,5,9,1,3,6,8,0,2,4
buffer db 10 dup(?)
datarea ends
;*********************************************
prognam segment
;--------------------------------------
main proc far
assume cs:prognam,ds:datarea
start:
;set up stack for return
push ds ;save old data segment
sub ax,ax ;put zero in ax
push ax ;save it on stack
;save DS register to current data segment
mov ax,datarea ;datarea segment address
mov ds,ax ;into ds register
;MIAN PART OF PROGRAM GOES HERE
lea dx,tip
mov ah,09h
int 21h
;换行
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,2
int 21h
mov si,0
;input number
lea bx,ary
mov cx,10
input: mov ah,01h
int 21h
sub al,30h ;判断输入字符是否为数字
js exit ;若输入有误,直接退出
cmp al,09h
jg exit
mov [bx],word ptr al
add dx,2
loop input
lea bx,pwd ;加密
mov cx,10
mov si,0
change: mov al,ary[si]
xlat
mov buffer[si],al ;将加密后的数写入buffer
inc si
loop change
exit: mov ah,4ch
int 21h
ret
main endp ;end of main part of prognam
;------------------------------------------
prognam ends
;**********************************************
end start
7、DOS 0A号功能获得用户输入字符串,其中可以自动计算字符长长度