我是汇编的新手,正在学习基础知识,但是我已经在这上面呆了一段时间了,不知道如何克服它。下面的代码可以工作,但是没有使用所需的基址寻址模式。
我必须使用基址寻址模式将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
1条答案
按热度按时间5gfr0r5j1#
很明显,
String
中只需要ASCII字符,因为您为N resb 1
保留了1个字节。您应该使用单字节寄存器将String的第5个字节复制到变量N
。使用bl
或al
代替bx
。或者,如果你坚持使用寄存器寻址模式,你可以在32位程序中使用任何GPR,例如
其他次要问题:
您为
String
保留了128个字节,但您要求sys_read
读取最多256个字节。n_line DB 0AH,0DH,"$"
以美元结尾的字符串在Linux中不使用,0AH
足以生成一个新行。您应该使用
sys_exit
让程序正常终止。