汇编语言实验7,输入一个字符串,如果其中包含字符$则返回$之前的字符。
时间: 2023-10-08 10:14:26 浏览: 159
下面是汇编语言实现这个功能的代码,注释中有详细的解释:
```assembly
section .data
; 用于存储输入的字符串
str db 100
section .bss
; 用于存储从键盘输入的字符
input resb 1
; 用于存储返回的字符串
result resb 100
section .text
global _start
_start:
; 读取输入的字符串
mov eax, 3 ; 系统调用号为3,表示读取输入
mov ebx, 0 ; 文件描述符为0,表示从标准输入读取
mov ecx, input ; 存储输入的字符
mov edx, 1 ; 读取一个字符
int 0x80 ; 执行系统调用
; 将输入的字符添加到字符串中
mov edi, str ; edi 指向字符串的起始地址
mov al, [input] ; 读取输入的字符
cmp al, 0x0A ; 判断是否输入了回车键
je end_input ; 如果输入了回车键,结束输入
mov [edi], al ; 将输入的字符添加到字符串中
inc edi ; edi 指向下一个字符
jmp _start ; 继续读取输入
end_input:
; 在字符串中查找$
mov edi, str ; edi 指向字符串的起始地址
mov ecx, 100 ; 遍历整个字符串
mov al, '$' ; 要查找的字符
repne scasb ; 执行查找操作
; 如果找到了$,将$之前的字符复制到 result 中
jne not_found ; 如果没找到$,跳转到 not_found
mov ecx, edi ; ecx 指向$的位置
dec ecx ; 将 ecx 指向$之前的字符
mov edi, result ; edi 指向 result 的起始地址
sub ecx, str ; 计算 $ 之前的字符的长度
mov edx, ecx ; edx 存储字符串的长度
cld ; 清除方向标志位
rep movsb ; 将 $ 之前的字符复制到 result 中
jmp end_prog ; 结束程序
not_found:
; 如果没找到$,将整个字符串复制到 result 中
mov edi, str ; edi 指向字符串的起始地址
mov edx, 100 ; 字符串的长度为100
mov esi, result ; esi 指向 result 的起始地址
cld ; 清除方向标志位
rep movsb ; 将整个字符串复制到 result 中
end_prog:
; 输出 result 中的字符串
mov eax, 4 ; 系统调用号为4,表示输出字符串
mov ebx, 1 ; 文件描述符为1,表示输出到标准输出
mov ecx, result ; 存储要输出的字符串
int 0x80 ; 执行系统调用
; 退出程序
mov eax, 1 ; 系统调用号为1,表示退出程序
xor ebx, ebx ; 返回值为0
int 0x80 ; 执行系统调用
```
这段代码的实现思路是:先读取输入的字符串,并将其存储在 `str`中,然后在 `str`中查找 `$`字符,如果找到了就将 `$`之前的字符复制到 `result`中,如果没找到就将整个字符串复制到 `result`中,并输出 `result`中的字符串。
阅读全文