汇编学习 发表于 2024-12-12 15:29:52

内存访问和端口访问的问题

有个问题比较困惑,大神帮忙解答一下啊。
1、内存访问中提到
所有的物理存储器被看做一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
如:我们可以在地址8000H-9FFFH的空间中写入数据,为显存地址空间;网卡地址空间可用同样方式访问。
2、端口访问中提到
CPU可以向接口卡(网卡、显卡)上的接口芯片发出端口读写命令,即将这些芯片上的寄存器进行编号,通过访问寄存器进行数据读写。

问题来了
1、既然CPU访问这些接口卡的数据可以直接通过特定的内存空间访问(如书中有练习题是在显存空间写入数据,然后在屏幕上显示masm!),那么为什么用要通过接口卡上的寄存器进行端口访问,这两者有什么区别吗?
2、设想一下访问过程,不知道是否正确。

场景:
在屏幕上输出“masm!”

CPU----->OUT (显卡芯片端口)------>显卡上的存储器----->屏幕上显示“masm!”
(书上练习题明明是直接写的啊,没有访问端口,好纠结!)

望解惑,谢谢啊!

FishC 发表于 2024-12-12 15:30:02


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:07

那就是说访问显卡内存空间有两种方式,一种是显存特定的内存空间,还有一种方式的通过端口访问吗?

FishC 发表于 2024-12-12 16:13:17

汇编学习 发表于 2024-12-12 16:13
那就是说访问显卡内存空间有两种方式,一种是显存特定 ...

是的,访问显卡的确有这两种方式:

1. **内存映射I/O**:这种方式是通过将显卡的寄存器和显存映射到内存空间中进行访问。通常情况下,开发者可以直接读取和写入这些内存地址来与显卡交互。这种方式的优点是访问速度相对较快,因为可以直接使用CPU的指令进行访问。

2. **端口映射I/O**:这种方式是通过I/O指令来访问显卡接口芯片上的寄存器。这种方式需要通过特定的I/O端口读写来进行显卡操作。在早期的PC机中,端口映射I/O是常用的方式。

两种方式各有优缺点,具体使用哪一种取决于硬件设计和系统要求。现代操作系统通常会提供更高级的接口,屏蔽这些底层的差异。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

汇编学习 发表于 2024-12-12 16:35:10

我们现在可以通过模拟器能写一段汇编程序吗?程序的功能是:通过端口为显卡写入数据,使得屏幕上显示masm!

FishC 发表于 2024-12-12 16:35:25

汇编学习 发表于 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]
查看完整版本: 内存访问和端口访问的问题