MloveAu 2016-04-27 04:34 采纳率: 0%
浏览 1545

这是汇编的大小写转化问题

当输入要改变的字符串后,第一次输出的为正常,而第二次就不正常了

data segment

;定义字符串缓冲区
;MAXLEN 表示允许输入的最大字符数量
;ACTLEN 表示实际输入的数量
;STR 用于存储输入的字符串
;以下面为例,允许最大输入5个字符,如果STR后面的长度也定义为6,则实际输入的字符数量仅为5,
;因为最后一个字符会用于存储0Dh(回车符号)
;例如:输入"1234",然后回车,此时内存的情况为: 05 00 31 32 33 34 0D
;因此,为了满足实际的最大数量,通常将MAXLEN定义得比实际的多1个。
title1 db "please enter a command$"
title2 db 0AH,0DH,20H,20H,20H,,20H,20H,"1: G to S$"
title3 db 0AH,0DH,20H,20H,20H,,20H,20H,"2: S to G$"
title4 db 0AH,0DH,20H,20H,20H,,20H,20H,"else: quit$"
endl db 0AH,0DH,20H,20H,20H,,20H,20H,"$"

MAXLEN db 19
ACTLEN db 0
STR db 20 dup('')
;提示语句
PROMPT1 db 13,10,"Please input a string:$"
PROMPT2 db 13,10,"Your string is :$"

ends

  • 写回答

1条回答

  • MloveAu 2016-04-27 04:35
    关注

    data segment

    ;定义字符串缓冲区
    ;MAXLEN 表示允许输入的最大字符数量
    ;ACTLEN 表示实际输入的数量
    ;STR 用于存储输入的字符串
    ;以下面为例,允许最大输入5个字符,如果STR后面的长度也定义为6,则实际输入的字符数量仅为5,
    ;因为最后一个字符会用于存储0Dh(回车符号)
    ;例如:输入"1234",然后回车,此时内存的情况为: 05 00 31 32 33 34 0D
    ;因此,为了满足实际的最大数量,通常将MAXLEN定义得比实际的多1个。
    title1 db "please enter a command$"
    title2 db 0AH,0DH,20H,20H,20H,,20H,20H,"1: G to S$"
    title3 db 0AH,0DH,20H,20H,20H,,20H,20H,"2: S to G$"
    title4 db 0AH,0DH,20H,20H,20H,,20H,20H,"else: quit$"
    endl db 0AH,0DH,20H,20H,20H,,20H,20H,"$"

    MAXLEN db 19
    ACTLEN db 0
    STR db 20 dup('')
    ;提示语句
    PROMPT1 db 13,10,"Please input a string:$"
    PROMPT2 db 13,10,"Your string is :$"

    ends
    code segment
    main proc far
    ;设置数据段寄存器
    assume cs:code,ds:data
    start:
    push ds
    sub ax,ax
    push ax
    mov ax,data
    mov ds,ax
    lea dx, title1
    mov ah, 9
    int 21h
    lea dx, title2
    mov ah, 9
    int 21h
    lea dx, title3
    mov ah, 9
    int 21h

    lea dx, title4
    mov ah, 9
    int 21h

    lea dx, endl
    mov ah, 9
    int 21h
    mov ah,1
    ; wait for a command....
    int 21h

    and al,0fh
    mov dh,al
    cmp dh,1
    jz GTOS
    cmp dh,2
    jz STOG
    jnz exit
    GTOS:
    call reminder
    mov si,0
    repeat1:
    add STR[si],20h
    inc si
    mov ax,si
    cmp ax,bx
    jz output
    jmp repeat1
    STOG:
    call reminder
    mov si,0
    repeat2:
    sub STR[si],20h
    inc si
    mov ax,si
    cmp ax,bx
    jz output
    jmp repeat2

    ;--------------------------------------
    ;此处作转换,即将字符串改为大写或小写
    ;
    ;--------------------------------------
    reminder proc
    ;提示输入,提示语句位于ds:dx处
    lea dx,PROMPT1
    mov ah, 9
    int 21h

    ;调用AH=0ah的21H中断程序,获取输入的字符串
    lea dx,MAXLEN
    mov ah,0ah
    int 21h
    
    ;取得实际输入的字符串数目
    mov bl,ACTLEN
    mov bh,0 
    ;将结尾处改为'$'以便调用AH=09H功能,即输出刚输入的字符串
    mov STR[bx],'$' 
    ;输出结果的提示语句  
    lea dx,PROMPT2
    mov ah, 9
    int 21h 
    ret 
    

    reminder endp

    output:
    ;输出大小写转换后的字符串
    lea dx,STR

    mov ah, 9
    int 21h
    lea dx,endl
    mov ah,9
    int 21h

    ;返回继续输入
    JMP start
    

    exit:
    ;返回操作系统
    mov ax, 4c00h
    int 21h

    code ends
    end start ; set entry point and stop the assembler.

    评论

报告相同问题?

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP