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
输出:


感谢您的全面解释!在这之后,我很清楚如何解决这个问题。谢谢你的全面解释!在这之后,我很清楚如何解决这个问题。