我在装配中依次访问字符串的每个字符时遇到了麻烦。在将print_string
声明为'Hello World!', 0
注册表之前,我有以下代码调用bx
例程:
mov bx, HELLO_MSG
call print_string
HELLO_MSG:
db 'Hello, World!', 0
在print_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.
答案 0 :(得分:3)
许多年前,有人这样说过:
你想要这个盒子,还是[盒子里]的内容?
我也尝试了以下内容:
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
CPU完全按照你的要求行事!
mov al, [bx]
将bx指向的值移动到al
(在您的情况下为H)
add al, 1
将H加1。
add bx, 1
mov al, [bx]
现在,al将包含E
或者你可以这样做:
mov al, [bx + 1]
获得E
在你的其他代码中,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
输出: