内存访问和端口访问的问题
有个问题比较困惑,大神帮忙解答一下啊。1、内存访问中提到
所有的物理存储器被看做一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
如:我们可以在地址8000H-9FFFH的空间中写入数据,为显存地址空间;网卡地址空间可用同样方式访问。
2、端口访问中提到
CPU可以向接口卡(网卡、显卡)上的接口芯片发出端口读写命令,即将这些芯片上的寄存器进行编号,通过访问寄存器进行数据读写。
问题来了
1、既然CPU访问这些接口卡的数据可以直接通过特定的内存空间访问(如书中有练习题是在显存空间写入数据,然后在屏幕上显示masm!),那么为什么用要通过接口卡上的寄存器进行端口访问,这两者有什么区别吗?
2、设想一下访问过程,不知道是否正确。
场景:
在屏幕上输出“masm!”
CPU----->OUT (显卡芯片端口)------>显卡上的存储器----->屏幕上显示“masm!”
(书上练习题明明是直接写的啊,没有访问端口,好纠结!)
望解惑,谢谢啊!
1. **内存访问与端口访问的区别:**
- **内存访问**:在内存映射I/O中,设备的寄存器被映射到系统的内存地址空间中。CPU通过访问这些内存地址来与设备进行通信。这种方式的优点是可以使用标准的内存访问指令来访问设备寄存器,缺点是可能会占用宝贵的内存地址空间。
- **端口访问**:在端口映射I/O中,设备的寄存器被映射到一个独立的I/O地址空间中。CPU通过专门的I/O指令(如IN和OUT指令)来访问这些端口。这种方式的优点是不会占用内存地址空间,缺点是需要使用专门的指令。
2. **访问过程的设想:**
- 当你在屏幕上输出“masm!”时,可能有两种方式:
- **内存映射I/O**:直接将数据写入显存的特定地址空间,显卡会自动将这些数据转换为屏幕上的显示。
- **端口映射I/O**:通过OUT指令将数据发送到显卡的特定端口,显卡再将数据写入显存并显示在屏幕上。
书上的练习题可能是使用了内存映射I/O的方式,所以直接写入显存地址空间就能显示内容,而没有涉及到端口访问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 那就是说访问显卡内存空间有两种方式,一种是显存特定的内存空间,还有一种方式的通过端口访问吗? 汇编学习 发表于 2024-12-12 16:13
那就是说访问显卡内存空间有两种方式,一种是显存特定 ...
是的,访问显卡的确有这两种方式:
1. **内存映射I/O**:这种方式是通过将显卡的寄存器和显存映射到内存空间中进行访问。通常情况下,开发者可以直接读取和写入这些内存地址来与显卡交互。这种方式的优点是访问速度相对较快,因为可以直接使用CPU的指令进行访问。
2. **端口映射I/O**:这种方式是通过I/O指令来访问显卡接口芯片上的寄存器。这种方式需要通过特定的I/O端口读写来进行显卡操作。在早期的PC机中,端口映射I/O是常用的方式。
两种方式各有优缺点,具体使用哪一种取决于硬件设计和系统要求。现代操作系统通常会提供更高级的接口,屏蔽这些底层的差异。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 我们现在可以通过模拟器能写一段汇编程序吗?程序的功能是:通过端口为显卡写入数据,使得屏幕上显示masm! 汇编学习 发表于 2024-12-12 16:35
我们现在可以通过模拟器能写一段汇编程序吗?程序的功 ...
要在汇编程序中通过端口为显卡写入数据并在屏幕上显示“masm!”,可以使用BIOS中断或直接访问显卡的端口。以下是一个简单的汇编程序示例,使用BIOS中断来实现这个功能:
section .data
message db 'masm!', 0
section .text
global _start
_start:
mov ah, 0x0E ; BIOS teletype function
mov si, message ; Load address of the message
print_loop:
lodsb ; Load byte at DS:SI into AL, increment SI
cmp al, 0 ; Check if end of string (null terminator)
je done ; If zero, end of string, jump to done
int 0x10 ; BIOS video interrupt
jmp print_loop ; Repeat for next character
done:
; Exit program (for DOS, use INT 20h or INT 21h with AH=4Ch)
mov ax, 0x4C00
int 0x21
这个程序使用BIOS中断 `0x10` 的 `0x0E` 功能来逐个字符地在屏幕上显示字符串“masm!”。请注意,这段代码适用于16位实模式环境,如DOSBox模拟器。
如果你想直接通过端口访问显卡,需要了解具体显卡的端口地址和命令集,这通常与硬件和模式有关。现代系统中,直接端口访问通常由操作系统管理,程序员通过更高级的API进行操作。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]