Assembly 在程序集中遍历内存中的字符串
在汇编中依次访问字符串的每个字符时遇到一些问题。在声明Assembly 在程序集中遍历内存中的字符串,assembly,nasm,Assembly,Nasm,在汇编中依次访问字符串的每个字符时遇到一些问题。在声明'Hello World!'之前,我有以下代码调用print_string例程,0进入bx注册表: mov bx, HELLO_MSG call print_string HELLO_MSG: db 'Hello, World!', 0 在print\u string中,我可以通过以下操作打印字符串的第一个字符: mov al, [bx] ; Trigger a single character print mov ah, 0x0e
'Hello World!'之前,我有以下代码调用print_string
例程,0
进入bx
注册表:
mov bx, HELLO_MSG
call print_string
HELLO_MSG:
db 'Hello, World!', 0
在print\u string
中,我可以通过以下操作打印字符串的第一个字符:
mov al, [bx]
; Trigger a single character print
mov ah, 0x0e
int 0x10
在我对汇编的基本理解中,第一个字符(H
)的地址被保存到了bx
,因此通过执行mov al,[bx]
,我取消了指针的引用,并将H
的实际值分配到al
基于这种理解(如果我错了,请纠正我),我尝试了以下方法:
mov cl, bx ; Move the pointer to `cl`
add cl, 1 ; Do pointer arithmetic to add one byte to the address (hopefully referencing the next character)
mov al, [cl] ; Dereference the address
但是我得到了这个错误,指向mov al,[cl]
行:
error: invalid effective address
我还尝试了以下方法:
mov al, [bx] ; Move the dereferenced address to `al` (so `al` has `H`)
add al, 1 ; Increment `al`, but of course I'm getting the ASCII value of `H` + 1, which is not the next character in the string.
很多很多年前,有人这样说:
你想要这个盒子,还是[盒子]里有什么 我还尝试了以下方法: CPU正在做你让它做的事情
mov al, [bx]
将bx指向的值移动到al
(在您的情况下,为H)
将1添加到H
add bx, 1
mov al, [bx]
现在,al将包含E
或者你可以:
mov al, [bx + 1]
得到
在您的另一个代码中,bx
是一个字大小的寄存器(16位),而cl
是一个字节大小的寄存器(8位),您截断了地址,因此地址无效(当您尝试将16位放入8位寄存器时,您希望发生什么?)
以下是一个例子:
HELLO_MSG db 'Hello, World!', 0
HELLO_LEN equ $ - HELLO_MSG
...
...
...
mov si, HELLO_MSG
xor bx, bx
Next:
mov al, byte [si + bx]
mov ah, 0x0e
int 0x10
mov al, 10
mov ah, 0x0e
int 0x10
inc bx
cmp bx, HELLO_LEN
jne Next
输出:
很多很多年前,有人这样说:
你想要这个盒子,还是[盒子]里有什么 我还尝试了以下方法: CPU正在做你让它做的事情
mov al, [bx]
将bx指向的值移动到al
(在您的情况下,为H)
将1添加到H
add bx, 1
mov al, [bx]
现在,al将包含E
或者你可以:
mov al, [bx + 1]
得到
在您的另一个代码中,bx
是一个字大小的寄存器(16位),而cl
是一个字节大小的寄存器(8位),您截断了地址,因此地址无效(当您尝试将16位放入8位寄存器时,您希望发生什么?)
以下是一个例子:
HELLO_MSG db 'Hello, World!', 0
HELLO_LEN equ $ - HELLO_MSG
...
...
...
mov si, HELLO_MSG
xor bx, bx
Next:
mov al, byte [si + bx]
mov ah, 0x0e
int 0x10
mov al, 10
mov ah, 0x0e
int 0x10
inc bx
cmp bx, HELLO_LEN
jne Next
输出:
感谢您的全面解释!在这之后,我很清楚如何解决这个问题。谢谢你的全面解释!在这之后,我很清楚如何解决这个问题。