我是靠谱客的博主 纯情小鸽子,最近开发中收集的这篇文章主要介绍汇编语言学习----系统调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、实验要求

试设计一程序,该程序从键盘输入一个字符串,输入的字符串最大允许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

最后

以上就是纯情小鸽子为你收集整理的汇编语言学习----系统调用的全部内容,希望文章能够帮你解决汇编语言学习----系统调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(93)

评论列表共有 0 条评论

立即
投稿
返回
顶部