解决 x86 中 mov 指令的问题
Addressing issue with mov instruction in x86
我正在尝试编写一个代码,在 VGA 显示器上打印一个字符(在 QEmu window 上看到)。这是我的代码:
(这个文件是putInMemory.asm)
;Put the charcter in cx at the beginning of line number given by dx
printInMemory:
pusha
mov es, 0xb000
mov ax, 0x8000
mult:
cmp dx, 0x1
je done
add ax, 160
jmp mult
done:
mov [es:ax], cx
add ax, 1
mov [es:ax], 0x7
popa
ret
我想将寄存器cx中包含的ascii码复制到内存位置0xb80a0,即显示中第2行的开头地址。这是代码:
[org 0x7c00]
mov cx, 'e'
mov dx, 0x2
call putInMemory
jmp $
%include "putInMemory.asm"
times 510-($-$$) db 0
dw 0xaa55
当我assemble上面的代码使用nasm时,我在第一个代码中得到以下错误:
putInMemory.asm:12: 错误:有效地址无效
如何在mov指令中使用分段寻址?
在 16 位代码中指定有效地址时不能使用 ax
(参见 table 命名为 "16 位寻址形式 ModR/M Byte 在英特尔的软件开发人员手册中)。请改用 bx
、bp
、si
或 di
。
我正在尝试编写一个代码,在 VGA 显示器上打印一个字符(在 QEmu window 上看到)。这是我的代码:
(这个文件是putInMemory.asm)
;Put the charcter in cx at the beginning of line number given by dx
printInMemory:
pusha
mov es, 0xb000
mov ax, 0x8000
mult:
cmp dx, 0x1
je done
add ax, 160
jmp mult
done:
mov [es:ax], cx
add ax, 1
mov [es:ax], 0x7
popa
ret
我想将寄存器cx中包含的ascii码复制到内存位置0xb80a0,即显示中第2行的开头地址。这是代码:
[org 0x7c00]
mov cx, 'e'
mov dx, 0x2
call putInMemory
jmp $
%include "putInMemory.asm"
times 510-($-$$) db 0
dw 0xaa55
当我assemble上面的代码使用nasm时,我在第一个代码中得到以下错误:
putInMemory.asm:12: 错误:有效地址无效
如何在mov指令中使用分段寻址?
在 16 位代码中指定有效地址时不能使用 ax
(参见 table 命名为 "16 位寻址形式 ModR/M Byte 在英特尔的软件开发人员手册中)。请改用 bx
、bp
、si
或 di
。