汇编语言编程作业——第四章
题目1
编写程序,在数据段中定义一串字符串如“abcdefg”,将该字符串逆向存储,即变为“gfedcba”,并输出到屏幕上。
运行结果
代码
;把abcdefg存在0~6h,在8~fh保存逆置之后的字符串
DATAS SEGMENT
db 'abcdefg'
db 8 dup(0)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
mov es,ax
mov di,0eh
mov bx,0
mov cx,7
mov dx,10h
s:
mov al,[bx]
mov [di],al ;逆置保存字符
add bx,1
sub di,1
loop s
mov cx,7
mov bx,8h
print: ;输出显示
MOV dl,[bx]
mov ah,2h
int 21h
add bx,1
loop print
MOV AH,4CH
INT 21H
CODES ENDS
END START
题目2
1.如上题的字符串,编写程序,在字符串中查找字符“d”所在的位置。
运行结果:
注意:
位置打印的是在字符串的第几位
DATAS SEGMENT
x db 'abcdefg'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
mov cx,7
mov bx,0
search:
mov dh,[bx]
cmp dh,'b' ;和'b'进行比较
jz find
inc bx
loop search
cmp cx,0
jz finish
find:
mov dl,bl ;找到之后进行输出
dec dl
add dl,30h
mov ah,02h
int 21h
finish:
MOV AH,4CH
INT 21H
CODES ENDS
END START
题目3
字符串查找程序,数据段中定义两个字符串str1,str2,str1的长度大于str2,编写程序,在str1中查找是否存在str2,是,则返回str2首字符在str1中的位置(从0开始),否则返回-1。
运行结果
注意
有压栈操作一定要有配套的弹栈操作
DATAS SEGMENT
sbuffer db 'helloworldhelloworld$'
dbuffer db 'world$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov es,ax
mov si,offset sbuffer
mov di,offset dbuffer
cld
mov cx,16 ;比较10次
again:
push cx
push si ;si入栈
mov cx,5 ;字符串长度
repz cmpsb ;开始比较
jz yes
pop si ;si出栈
inc si ;指向下一个字符
mov di,offset dbuffer ;di初始化为第一个字符
pop cx ;cx出栈并且减1
loop again ;循环
jmp no ;跳转到no
yes: ;显示第一次出现的位置
pop dx
pop cx
add dx,30h
mov ah,02h
int 21h
jmp e
no: ;显示-1
pop dx
pop cx
mov dl,2dh
mov ah,02h
int 21h
mov dl,31h
mov ah,02h
int 21h
e:
mov ah,4ch
int 21h
CODES ENDS
END START
题目4
编写字符串显示子程序DispString,参数为字符串的地址,字符串用’0’结束。
DATAS SEGMENT
x db 'abcdefg',0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov bx,offset x
call Dispstring
MOV AH,4CH
INT 21H
Dispstring proc
mov cx,7
s:
mov dl,[bx]
cmp dl,'0' ;判断字符串是否结束
jz return
mov ah,02h ;逐个字符显示
int 21h
inc bx
loop s
return:
ret
Dispstring endp
CODES ENDS
END START
题目5
编写二进制到十进制字符串转换子程序Bin2DecString,参数1为待转换的数据,长度为16位,参数2为字符串缓冲区地址,完成将参数1的数据转换为十进制字符串,存到参数指定的地址处,字符串结尾用’0’表示。
假设
假设计算11+9,显示结果,以字符串形式输出
如果要修改,可以改两个操作数
DATAS SEGMENT
sum db 0,0
mesg db '11+9='
result db 0,0,'$'
n1 db 9 ;操作数1
n2 db 11 ;操作数2
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
start1:
mov bx,offset sum
mov ah,n1
mov al,n2
add ah,al
mov [bx],ah
call change
mov ah,9
mov dx,offset mesg
int 21h
MOV AH,4CH
INT 21H
change proc
last:
CMP byte ptr [BX],10 ;和10作比较,如果大于10,减10,同时十位加1
JC next
sub byte ptr [bx],10
inc byte ptr [bx+7]
jmp last
next:
mov cl,[bx]
add byte ptr [bx+8],cl ;显示
add byte ptr [bx+7],30h
add byte ptr [bx+8],30h
ret
change endp
CODES ENDS
END START