用微型计算机原理代码编一程序,统计一个以‘$’结尾的字符串的长度,并要求过滤去第一个非空格字符 之前的所有空格。
时间: 2024-03-02 12:49:28 浏览: 157
好的,以下是基于微型计算机原理的汇编代码实现:
```
.MODEL TINY
.386
.CODE
ORG 100h
; 程序入口
START:
MOV AX, SEG MESSAGE ; 将 MESSAGE 段地址加载到 AX 中
MOV DS, AX ; 将 DS 寄存器设置为 MESSAGE 段地址
CALL GET_STRING_LENGTH ; 调用 GET_STRING_LENGTH 函数
MOV AH, 4Ch ; 设置 DOS 功能号为 4Ch (程序结束)
INT 21h ; 调用 DOS 中断
; GET_STRING_LENGTH 函数
GET_STRING_LENGTH:
MOV AH, 0Ah ; 设置 DOS 功能号为 0Ah (读取字符串)
MOV DX, OFFSET BUFFER ; 将 BUFFER 缓冲区地址加载到 DX 中
INT 21h ; 调用 DOS 中断
MOV SI, OFFSET BUFFER + 2 ; 将 SI 寄存器设置为 BUFFER 缓冲区第一个字符的地址
; 过滤第一个非空格字符之前的空格
LOOP1:
LODSB ; 从缓冲区读取一个字符到 AL 中,同时 SI 自动加 1
CMP AL, ' ' ; 比较 AL 中的字符是否为空格
JE LOOP1 ; 如果是空格,则跳转到 LOOP1 标签处
JMP NEXT ; 如果不是空格,则跳转到 NEXT 标签处
; 统计字符串长度
NEXT:
CMP AL, '$' ; 比较 AL 中的字符是否为 '$'
JE END ; 如果是 '$',则跳转到 END 标签处
INC LENGTH ; 如果不是 '$',则字符串长度加 1
JMP LOOP1 ; 然后跳转到 LOOP1 标签处
; 输出字符串长度
END:
MOV DL, LENGTH ; 将字符串长度(不包括 '$')加载到 DL 中
ADD DL, 30h ; 将 DL 中的数字转换为 ASCII 码
MOV AH, 2h ; 设置 DOS 功能号为 2h (输出字符)
INT 21h ; 调用 DOS 中断
RET ; 返回
.DATA
MESSAGE DB 0Ah, 0Dh, 'Please enter a string (end with $): $'
BUFFER DB 80, ?, 80 DUP ('$') ; 缓冲区,第一字节存储输入字符串长度,第二字节存储输入字符串的地址
LENGTH DB 0 ; 字符串长度
.END
```
这段汇编代码包括一个 `GET_STRING_LENGTH` 函数,用于统计一个以 '$' 结尾的字符串的长度,并要求过滤去第一个非空格字符之前的所有空格。在函数中,我们使用 DOS 功能号为 0Ah 的中断来读取用户输入的字符串,然后使用 LODSB 指令逐个字符地读取字符串,并通过 CMP 指令比较字符是否为空格和是否为 '$',最终得到字符串长度并输出。
阅读全文