assembly 如何使用基址寻址模式将字符保存到变量中?

k10s72fa  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(123)

我是汇编的新手,正在学习基础知识,但是我已经在这上面呆了一段时间了,不知道如何克服它。下面的代码可以工作,但是没有使用所需的基址寻址模式。
我必须使用基址寻址模式将String中的第五个字符复制到变量N中。我的做法(没有使用基址寻址模式)是使用带偏移量的基址。我不知道如何使用基址寻址模式来实现这一点,任何帮助都将不胜感激。

;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
;This is where my problem is
mov bx, [String+4]
mov [N], bx
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
5gfr0r5j

5gfr0r5j1#

;This is where my problem is
mov bx, [String+4]
mov [N], bx

很明显,String中只需要ASCII字符,因为您为N resb 1保留了1个字节。您应该使用单字节寄存器将String的第5个字节复制到变量N。使用blal代替bx
或者,如果你坚持使用寄存器寻址模式,你可以在32位程序中使用任何GPR,例如

mov esi,String   ; Put address og String to esi.
 mov ebx,4        ; Put index of 5th byte to ebx.
 mov al,[esi+ebx] ; Load 5th byte to al.
 mov [N],al       ; Store al to the variable.

其他次要问题:
您为String保留了128个字节,但您要求sys_read读取最多256个字节。
n_line DB 0AH,0DH,"$"以美元结尾的字符串在Linux中不使用,0AH足以生成一个新行。
您应该使用sys_exit让程序正常终止。

相关问题