您的位置:首页 > 其它

汇编语言学习----系统调用

2017-12-22 18:22 411 查看
一、实验要求

试设计一程序,该程序从键盘输入一个字符串,输入的字符串最大允许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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: