【问题标题】:Split strings on Assembly x86 16-bit在 Assembly x86 16 位上拆分字符串
【发布时间】:2017-03-12 22:06:39
【问题描述】:

我正在尝试编写一个程序,它从键盘读取 3 个字符串,然后以小写显示 2 个字符串,最后一个以大写显示。这是我到目前为止所得到的:我可以读取字符串,但随后它将所有内容都转换为大写。无论如何只转换最后一个字符串?提前致谢

.MODEL SMALL
.DATA
    MSG  DB  0DH,0AH, 'ENTER A STRING: $'
    MSG2 DB  0DH,0AH, ' YOUR STRING IS  :-----> :  $'
    STR1 DB  255 DUP(?)
.CODE
BEGIN:

    MOV AX,@DATA
    MOV DS,AX

    LEA DX,MSG  
    MOV AH,09H
    INT 21H

    LEA SI,STR1 
    MOV AH,01H

READ:
    INT 21H 
    ;MOV BL,AL

    CMP AL,0DH
    JE  DISPLAY

    SUB AL,20H
    MOV [SI],AL
    INC SI

    ;CMP BL,0DH
    JMP READ

DISPLAY:

    MOV AL,'$'  ;caracter '$'
    MOV [SI],AL ;

    LEA DX,MSG2 
    MOV AH,09H  
    INT 21H 


    LEA DX,STR1 
    MOV AH,09H  
    INT 21H

    ; MOV AH,4CH
    ; INT 21H

.EXIT
END BEGIN

我正在使用 TASM。

【问题讨论】:

  • 有没有只转换最后一个字符串? 是的,当然有。一种方法是跟踪前两个字符串末尾的位置,以便在完成读取输入后只循环最后一个字符串。
  • 对不起,但你很难触发我的讽刺......就像“不,现在计算机中的所有字符串都必须大写”。你基本上已经回答了你自己的问题。只是不要转换前两个字符串,然后只有第三个字符串会被转换。尝试将其视为一种计算,将问题分解为一些公式、计数器、数字操作......甚至字符串只是 ASCII 编码中的连续字节值 (0-255) 流。因此,如果您只想对某些特定字符串执行某些操作,请首先定义如何决定字符串何时开始/停止(每个空格?)。数一数。 3日执行大写
  • sub al,20h 是“大写”的一种有点蹩脚的方式,它会如何处理已经大写的字母,比如'A'?而是检查AND,它是如何工作的,然后查看 ASCII 表......它是专门为这个任务设计的,这就是为什么 'a''A' OR 0x20,而不是 'Z'+1

标签: assembly x86 dos tasm 16-bit


【解决方案1】:

感谢大家的 cmets。我能够通过这种方式解决它:

.MODEL SMALL
.STACK 100h
.DATA
    Mensagem1  DB  "Meu Prompt>>",'$',13,10
    first DB  80 DUP (?)
.CODE
    MOV AX, @DATA
    MOV DS, AX
    LEA DX, Mensagem1
    MOV AH, 9
    INT 21H
    LEA SI, first   
READ:
    MOV AH, 01H
    INT 21H
    CMP AL, 13
    JE  DONE
    OR AL, 20H
    MOV [SI], AL
    INC SI
    CMP AL, 20H
    JE READ2
    JMP READ
READ2:
    INT 21H
    CMP AL, 13
    JE  DONE
    OR AL, 20H
    MOV [SI], AL
    INC SI
    CMP AL, 20H
    JE READ3
    JMP READ2
READ3:
    INT 21H
    CMP AL, 13
    JE  DONE
    XOR AL, 20H
    MOV [SI], AL
    INC SI
    JMP READ3
DONE:
    MOV AL, '$'
    MOV [SI], AL
    LEA DX, Mensagem1
    MOV AH, 9
    INT 21H
    LEA DX, first
    MOV AH, 9
    INT 21H
    MOV AH,4CH
    INT 21H
END

【讨论】:

  • XOR AL, 20H 翻转大小写,这与始终将其设为大写不同。此外,如果要确保不更改非字母字符(例如 '-''7'),则需要一些条件。 stackoverflow.com/questions/35932273/…上有几个详细的答案。
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多