对于 x86 架构,使用 nasm 无法正确执行换行符
Newline not executing properly using nasm for x86 architecture
我在字符串末尾使用指令 0xa
来创建换行符,这样打印的最后一个字符串就不会 运行 进入下一个。
mov bx, MESSAGE
call print_string
mov bx, ANOTHER
call print_string
hlt
print_string:
pusha
string_loop:
mov al, [bx]
cmp al, 0
jne print_char
popa
ret
print_char:
mov ah, 0x0e
int 0x10
add bx, 1
jmp string_loop
;global vars
MESSAGE: db 'Example string',0xa,0
ANOTHER: db 'Another example string',0xa,0
;padding/magic number
times 510-($-$$) db 0
dw 0xaa55
唯一的问题是,虽然字符串确实在最后一行的下方打印一行,但新行不会重置屏幕上的 x 位置,因此它不会直接打印在前一个字符串的下方,而是打印在下方并且就在前一个字符串之后。
示例输出:
Example string
Another example string
如何编写这段代码,以便字符串直接打印在前一个字符串的下面?
如何处理 Jester 的评论(在换行符旁边添加回车 return):
MESSAGE: db 'Example string',13,10,0
ANOTHER: db 'Another example string',13,10,0
如何处理 Ped7g 的评论(将 BX
更改为 SI
并设置 BL
和 BH
参数):
mov bx, 0007h ;Display page 0, graphics color 7
mov si, MESSAGE
call print_string
...
string_loop:
mov al, [si]
...
add si, 1
jmp string_loop
由于这是引导加载程序代码 (times 510-($-$$) db 0
dw 0xaa55
) 并且 ORG 0 是默认值,因此您最好明确地将 DS
段寄存器设置为零。不要为此相信您的执行环境!
xor ax, ax
mov ds, ax
把这个放在第一位。
我在字符串末尾使用指令 0xa
来创建换行符,这样打印的最后一个字符串就不会 运行 进入下一个。
mov bx, MESSAGE
call print_string
mov bx, ANOTHER
call print_string
hlt
print_string:
pusha
string_loop:
mov al, [bx]
cmp al, 0
jne print_char
popa
ret
print_char:
mov ah, 0x0e
int 0x10
add bx, 1
jmp string_loop
;global vars
MESSAGE: db 'Example string',0xa,0
ANOTHER: db 'Another example string',0xa,0
;padding/magic number
times 510-($-$$) db 0
dw 0xaa55
唯一的问题是,虽然字符串确实在最后一行的下方打印一行,但新行不会重置屏幕上的 x 位置,因此它不会直接打印在前一个字符串的下方,而是打印在下方并且就在前一个字符串之后。
示例输出:
Example string
Another example string
如何编写这段代码,以便字符串直接打印在前一个字符串的下面?
如何处理 Jester 的评论(在换行符旁边添加回车 return):
MESSAGE: db 'Example string',13,10,0
ANOTHER: db 'Another example string',13,10,0
如何处理 Ped7g 的评论(将 BX
更改为 SI
并设置 BL
和 BH
参数):
mov bx, 0007h ;Display page 0, graphics color 7
mov si, MESSAGE
call print_string
...
string_loop:
mov al, [si]
...
add si, 1
jmp string_loop
由于这是引导加载程序代码 (times 510-($-$$) db 0
dw 0xaa55
) 并且 ORG 0 是默认值,因此您最好明确地将 DS
段寄存器设置为零。不要为此相信您的执行环境!
xor ax, ax
mov ds, ax
把这个放在第一位。