计算字符串长度-汇编语言

设有一字符串存放在以 BUF 为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出

DATAS SEGMENT
BUF DB 20,?,20 DUP('$')
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV ES,AX  
	LEA DX,BUF
	
	MOV AH,10		;输入
    INT 21H   
    
    mov dl,0ah  ;换行
    mov ah,2 
    int 21h  
	mov dl,0dh  
    mov ah,2  
    int 21h 
    
	MOV BX,OFFSET BUF[2]
	MOV AL,0
	MOV CL,0
	
L: 
	MOV AL,BUF[BX]
	CMP AL,'$'
	JE OVER
	INC BX
	INC CL
	JMP L

OVER: 
	MOV DL,CL
	ADD DL,30H 
	MOV AH,02
	INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START

结果图示例:

基于汇编语言计算字符串长度程序通常需要通过逐个字符遍历字符串,直到遇到字符串结束符(通常是ASCII码为0的空字符)。以下是一个简单的基于x86汇编语言计算字符串长度的程序示例: ```assembly section .data myString db 'Hello, World!', 0 ; 定义字符串,并以0结尾 section .text global _start _start: mov eax, myString ; 将字符串地址加载到EAX寄存器 call string_length ; 调用计算字符串长度的函数 ; 此时,EAX寄存器中存储了字符串长度 ; 退出程序 mov ebx, eax ; 将字符串长度作为退出码 mov eax, 1 ; 系统调用号 (sys_exit) int 0x80 ; 调用内核 string_length: push ebx ; 保存EBX寄存器的值 mov ebx, eax ; 将字符串地址复制到EBX寄存器 next_char: cmp byte [eax], 0 ; 比较当前字符是否为0 jz end_string ; 如果是0,跳转到结束 inc eax ; 否则,指向下一个字符 jmp next_char ; 继续循环 end_string: sub eax, ebx ; 计算字符串长度 pop ebx ; 恢复EBX寄存器的值 ret ; 返回调用点 ``` ### 解释 1. **数据段定义**: - `myString` 定义了一个以0结尾的字符串。 2. **代码段定义**: - `_start` 是程序的入口点。 -字符串地址加载到EAX寄存器,并调用 `string_length` 函数。 - 字符串长度计算完成后,程序退出。 3. **string_length 函数**: - 保存EBX寄存器的值。 -字符串地址复制到EBX寄存器。 - 循环遍历字符串,直到遇到0字符。 - 计算字符串长度- 恢复EBX寄存器的值并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值