惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

faryou的博客

5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】更灵活的定位内存 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【汇编&硬件】网络连接相关中断的具体实现
作者: faryou · 2026-03-21 · via faryou的博客

前言

在8086汇编环境中,网络连接功能通常依赖硬件(如网卡)和底层协议(如TCP/IP简化版),且8086本身无原生网络支持,需通过外接网卡及端口操作实现。以下是一个模拟网络连接中断的简化实现,包含基本的连接建立、数据发送/接收功能,基于假设的网卡端口和简化协议,供学习参考。

代码实现

; 常量定义(假设的网卡端口和状态码)
NET_CTRL_PORT equ 0300h ; 网卡控制端口
NET_DATA_PORT equ 0301h ; 网卡数据端口
NET_STATUS_PORT equ 0302h ; 网卡状态端口
NET_CONNECTED equ 01h ; 连接成功状态
NET_DISCONNECTED equ 00h ; 断开状态
NET_DATA_READY equ 02h ; 数据就绪状态
 
code segment
    assume cs:code, ds:data
 
; 网络连接中断服务程序(入口:AH=功能号)
; 功能:
; AH=00h:建立网络连接(DX=目标IP地址低16位,CX=目标端口)
; AH=01h:断开网络连接
; AH=02h:发送数据(SI=数据缓冲区地址,CX=数据长度)
; AH=03h:接收数据(DI=接收缓冲区地址,CX=最大接收长度,返回CX=实际长度)
; AH=04h:获取连接状态(返回AL=状态:0=断开,1=连接)
net_int proc far
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push es
    push ds ; 保存所有寄存器
    push bp
    mov bp, sp
 
    ; 根据功能号跳转处理
    cmp ah, 00h
    je net_connect ; 建立连接
    cmp ah, 01h
    je net_disconnect ; 断开连接
    cmp ah, 02h
    je net_send ; 发送数据
    cmp ah, 03h
    je net_recv ; 接收数据
    cmp ah, 04h
    je net_get_status ; 获取状态
    jmp int_end ; 不支持的功能
 
; 功能00h:建立网络连接
; 入口:DX=目标IP(低16位),CX=目标端口
; 原理:向网卡发送连接请求,等待响应
net_connect:
    ; 保存目标IP和端口
    mov [dest_ip], dx
    mov [dest_port], cx
 
    ; 向网卡控制端口发送连接命令(假设命令01h)
    mov al, 01h
    out NET_CTRL_PORT, al
 
    ; 等待网卡响应(轮询状态端口)
    mov cx, 0FFFFh ; 超时计数
wait_connect:
    in al, NET_STATUS_PORT
    test al, NET_CONNECTED
    jnz connect_ok ; 连接成功
    loop wait_connect
    jmp int_end ; 超时失败
 
connect_ok:
    mov [net_state], NET_CONNECTED ; 更新状态为连接
    jmp int_end
 
; 功能01h:断开网络连接
; 操作:发送断开命令,重置连接状态
net_disconnect:
    mov al, 02h ; 断开命令(假设02h)
    out NET_CTRL_PORT, al
    mov [net_state], NET_DISCONNECTED ; 更新状态为断开
    jmp int_end
  
; 功能02h:发送数据
; 入口:SI=数据缓冲区,CX=数据长度(<=255)
; 操作:逐个字节写入数据端口
net_send:
    cmp [net_state], NET_CONNECTED
    jne int_end ; 未连接则退出
 
    mov bl, cl ; BL保存长度
    mov bh, 0
    mov si, si ; SI指向数据
 
send_loop:
    mov al, [si] ; 读取数据字节
    out NET_DATA_PORT, al ; 写入网卡
    inc si
    dec bl
    jnz send_loop
    jmp int_end
 
; 功能03h:接收数据
; 入口:DI=接收缓冲区,CX=最大长度;返回:CX=实际接收长度
; 操作:从数据端口读取可用数据
net_recv:
    cmp [net_state], NET_CONNECTED
    jne int_end ; 未连接则退出
 
    in al, NET_STATUS_PORT
    test al, NET_DATA_READY
    jz recv_end ; 无数据则退出
 
    mov bl, 0 ; BL计数实际长度
recv_loop:
    in al, NET_DATA_PORT ; 从网卡读取数据
    mov [di], al
    inc di
    inc bl
    dec cx
    jz recv_end ; 达到最大长度
    ; 检查是否还有数据(简化:假设一次读完)
    in al, NET_STATUS_PORT
    test al, NET_DATA_READY
    jnz recv_loop
 
recv_end:
    mov cx, bx ; 返回实际接收长度
    jmp int_end
 
; 功能04h:获取连接状态
; 返回:AL=当前状态(0=断开,1=连接)
net_get_status:
    mov al, [net_state]
    jmp int_end
 
; 中断结束:恢复寄存器并返回
int_end:
    pop bp
    pop ds
    pop es
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    iret ; 中断返回
net_int endp
 
; 安装自定义网络中断向量(使用int 61h,用户自定义中断)
install proc
    cli ; 关中断,防止安装冲突
    mov ax, 0
    mov es, ax ; ES指向中断向量表(0段)
    mov di, 61h*4 ; int 61h向量地址:61h×4=0000:0184
    mov ax, offset net_int ; 中断服务程序偏移地址
    stosw ; 写入偏移量
    mov ax, cs ; 中断服务程序段地址
    stosw ; 写入段地址
    sti ; 开中断
    ret
install endp
 
; 主程序:测试网络连接功能
main:
    mov ax, data
    mov ds, ax ; 初始化数据段
 
    call install ; 安装网络中断
 
    ; 测试1:建立连接(目标IP=0A0A0A0A(模拟10.10.10.10),端口=80)
    mov ah, 00h
    mov dx, 0A0A0h ; IP低16位(0A0A)
    mov cx, 80 ; 端口80
    int 61h
 
    ; 测试2:发送数据("Hello")
    mov ah, 02h
    mov si, offset send_buf
    mov cx, 5 ; 长度5
    int 61h
 
    ; 测试3:接收数据(最多10字节)
    mov ah, 03h
    mov di, offset recv_buf
    mov cx, 10
    int 61h ; 返回CX=实际长度
 
    ; 测试4:获取状态并显示(简化:通过字符表示)
    mov ah, 04h
    int 61h
    cmp al, NET_CONNECTED
    jne show_disconnected
    ; 连接成功,显示'C'
    mov ah, 09h
    mov al, 'C'
    mov bl, 07h
    mov cx, 1
    int 10h
    jmp end_test
show_disconnected:
    ; 断开,显示'D'
    mov ah, 09h
    mov al, 'D'
    mov bl, 07h
    mov cx, 1
    int 10h
 
end_test:
    ; 断开连接
    mov ah, 01h
    int 61h
 
    jmp $ ; 暂停
 
code ends
 
; 数据段:保存网络状态和缓冲区
data segment
    net_state db NET_DISCONNECTED ; 网络状态(0=断开,1=连接)
    dest_ip dw 0 ; 目标IP地址(低16位)
    dest_port dw 0 ; 目标端口
    send_buf db 'Hello' ; 发送缓冲区
    recv_buf db 10 dup(0) ; 接收缓冲区(最大10字节)
data ends
 
    end main

代码说明

  1. 硬件抽象:假设网卡通过3个端口(控制、数据、状态)与CPU通信,定义了连接、断开等命令及状态码,模拟真实网卡的交互逻辑。
  2. 中断功能:实现了网络连接的核心操作:a.建立/断开连接:通过控制端口发送命令,轮询状态判断结果。b.发送/接收数据:通过数据端口读写字节,限制长度以简化处理。c.状态查询:返回当前连接状态(连接/断开)。
  3. 中断安装:使用用户自定义中断号(int 61h),修改中断向量表指向自定义服务程序,安装时关中断保证原子性。
  4. 测试逻辑:主程序依次测试连接建立、数据发送、接收及状态查询,并通过屏幕显示状态('C'表示连接,'D'表示断开)。