You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用基址寻址模式将字符存入变量?汇编技术求助

基址寻址实现字符复制的修正方案

你当前用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:35:31