如何使用基址寻址模式将字符存入变量?汇编技术求助
基址寻址实现字符复制的修正方案
你当前用的mov bx, [String+4]属于直接寻址(符号地址+立即数偏移),并非要求的基址寻址。基址寻址的核心是用通用寄存器存储数据的起始基地址,再通过寄存器+偏移的方式访问目标内存。
针对你的需求,修正步骤如下:
- 将字符串
String的起始地址加载到基址寄存器(比如EBX,x86中EBX/EBP/ESI/EDI都可作为基址寄存器) - 以基址寄存器为基础,加上偏移量4(第5个字符的索引是0-based,所以偏移4)访问目标字符
- 将读取到的1字节字符存入
N(你之前用BX会读取2字节,而N只占1字节,这是潜在bug,改用8位寄存器AL)
修改后的核心代码段:
;Copy 5th character to N, using base addressing mode mov ebx, String ; 将String的起始地址存入基址寄存器EBX mov al, [ebx + 4] ; 基址寻址:通过EBX(基址)+4(偏移)访问第5个字符 mov [N], al ; 将字符存入N(1字节)
完整修正后的代码:
;Initialized data section .data msg1: db "Input a string: ",10 msg1_L: equ $-msg1 ;calculate size of msg1 n_line DB 0AH,0DH,"$" ;Uninitialized data section .bss String resb 128 N resb 1 section .text global _start: _start: ;Print message mov eax, 4 ;sys_write mov ebx, 1 ;stdout mov ecx, msg1 ;message to write mov edx, msg1_L ;message length int 80h ;input message and save mov eax, 3 mov ebx, 0 mov ecx, String mov edx, 256 int 80h ;Copy 5th character to N, using base addressing mode mov ebx, String ; 加载基地址到EBX mov al, [ebx + 4] ; 基址寻址访问目标字符 mov [N], al ; 存入变量N mov eax, 4 ;sys_write mov ebx, 1 ;stdout mov ecx, N ;message to write mov edx, 1 ;message length int 80h ;Print new line mov eax, 4 ;sys_write mov ebx, 1 ;stdout mov ecx, n_line ;message to write mov edx, 1 ;message length int 80h
补充说明:
- 基址寻址的优势在于可以动态修改基址寄存器的值,实现灵活的内存访问(比如遍历数组时只需要更新基址寄存器)
- 使用
AL是因为字符是单字节数据,避免多字节读取导致的内存越界或数据错误
内容的提问来源于stack exchange,提问作者mexicanburrito
相关产品推荐
相关产品推荐

