概述
一、实验要求
试设计一程序,该程序从键盘输入一个字符串,输入的字符串最大允许15个字符且以回车字符结束(15个字符含回车符)。同时,如果输入的字符串中有数字字符,则将数字字符删除,并新起一行显示处理后的字符串。
以下是定义好的数据段和堆栈段:
data segment
maxlen db 15;0AH子功能入口参数,指定最大字符数
inputlen db 0;0AH子功能出口参数,返回实际输入的字符数
str1 db 15 dup(0);0AH子功能的字符串缓存区
str2 db 15 dup(0);09H子功能的字符串缓存区
data ends
stack1 segment stack
dw 40h dup(0)
stack1 ends
提示:1、如何实现光标新起一行的功能:回车符和换行符搭配使用;
2、数值字符的ASCII码范围为30H~39H。
; multi-segment executable file template.
data segment
maxlen db 15 ;0AH子功能入口参数,指定最大字符数
inputlen db 0 ;0AH子功能出口参数,返回实际输入的字符数
str1 db 15 dup(0) ;0AH子功能的字符串缓存区
str2 db 15 dup(0) ;09H子功能的字符串缓存区
data ends
stack1 segment stack
dw 40h dup(0)
stack1 ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,maxlen
mov ah,0ah
int 21h ;用户输入字符串
mov cl,inputlen
mov di,0
mov si,0
;不是数值字符,存储到str2中
lop:
cmp str1[di],30h
jb store ;前面的元素小于30h 则跳转到store将字符缓存下来
cmp str1[di],39h
ja store
add di,1 ;继续进行下一个字符的操作
loop lop
store:
mov al,str1[di]
mov str2[si],al
add di,1
add si,1
loop lop
;将字符输出
mov str2[si],'$'
mov dl,0dh ; 回车
mov ah,02h
int 21h
mov dl,0ah ;换行
mov ah,02h
int 21h
lea dx,str2
mov ah,09h
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
最开始的程序是这个样子的,如上。
在lop里面和store里面分别加入了loop lop语句,于是就导致了在执行完期望的lop之后,cx为0。之后按照顺序执行了store代码段,在执行完最后一句loop lop之后,cx自动被减为FFFF,于是就开启了无限循环的模式。
问题出现在两个loop那里
其实最终的目的就是不管怎么样,string1的index都加一,并且执行下一次循环,于是标记目标的代码,无论是存储还是不存储,都在最后跳转到那一段代码处。
修改如下
; multi-segment executable file template.
data segment
maxlen db 15 ;0AH子功能入口参数,指定最大字符数
inputlen db 0 ;0AH子功能出口参数,返回实际输入的字符数
str1 db 15 dup(0) ;0AH子功能的字符串缓存区
str2 db 15 dup(0) ;09H子功能的字符串缓存区
data ends
stack1 segment stack
dw 40h dup(0)
stack1 ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,maxlen
mov ah,0ah
int 21h ;用户输入字符串
mov cl,inputlen
mov di,0
mov si,0
jcxz lop
lop:
cmp str1[di],30h
jb store ;前面的元素小于30h 则跳转到store将字符缓存下来
cmp str1[di],39h
ja store
jmp u
store:
mov al,str1[di]
mov str2[si],al
add si,1
jmp u
;读取输入的下一个字符,继续执行
u:
add di,1
loop lop
;将字符输出
k:
mov str2[si],'$'
mov dl,0dh ; 回车
mov ah,02h
int 21h
mov dl,0ah ;换行
mov ah,02h
int 21h
lea dx,str2
mov ah,09h
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler
感想:
1.共同需要执行的代码把它单独拎出来
2.发现汇编程序里面没有花括号,不能像高级语言那样把一段代码框起来,所以需要对下一段代码做标志
3.汇编语言要规范,例如在这个例子里面我把string1的index设为di,string2的index设为si,增强程序的可读性。
4.loop lop大概可以理解为 add cx,1和jmp lop
最后
以上就是纯情小鸽子为你收集整理的汇编语言学习----系统调用的全部内容,希望文章能够帮你解决汇编语言学习----系统调用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复