emu8086中ALP代码section指令报错:原因及修复方法
问题根源
你遇到的illegal instruction错误是因为emu8086不支持NASM风格的section .data/section .text段声明语法。emu8086采用MASM/TASM兼容的段定义规则,直接使用NASM的section指令会被识别为非法指令,这就是第3、7行报错的核心原因。
修复方案
1. 替换段定义语法
将NASM风格的段声明替换为emu8086支持的格式:
- 数据段:用
DATA SEGMENT开头,DATA ENDS结尾 - 代码段:用
CODE SEGMENT开头,CODE ENDS结尾 - 必须添加
ASSUME CS:CODE, DS:DATA指令关联段寄存器与段
2. 适配BIOS图形页与显示逻辑
确保程序完成以下关键步骤:
- 设置正确的图形模式(比如VGA 640x480 16色模式)
- 切换到PAGE-2显示页
- 用BIOS中断
INT 10H绘制指定长度的水平线 - 在两条水平线中间输出注册号字符串
修复后的可运行代码示例
; emu8086兼容的汇编代码 DATA SEGMENT REGISTRATION_NO DB 'REG-78901' ; 自定义注册号 STR_LEN EQU $-REGISTRATION_NO ; 自动计算字符串长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: ; 初始化数据段寄存器 MOV AX, DATA MOV DS, AX ; 设置VGA 640x480 16色图形模式 MOV AH, 00H MOV AL, 12H INT 10H ; 切换到显示页2(PAGE-2) MOV AH, 05H MOV AL, 02H INT 10H ; 绘制第一条水平线(颜色:蓝色,Y=238,X范围295-344,共50像素) MOV AH, 0CH ; BIOS写像素中断 MOV AL, 01H ; 蓝色 MOV BH, 02H ; 目标显示页2 MOV CX, 295 ; 起始X坐标 MOV DX, 238 ; Y坐标 LINE1_LOOP: INT 10H INC CX CMP CX, 345 ; 295+50=345,循环50次 JNE LINE1_LOOP ; 绘制第二条水平线(颜色:白色,Y=242,X范围295-344) MOV AH, 0CH MOV AL, 0FH ; 白色 MOV BH, 02H MOV CX, 295 MOV DX, 242 LINE2_LOOP: INT 10H INC CX CMP CX, 345 JNE LINE2_LOOP ; 在两条水平线中间显示注册号(位置:X=300,Y=240,颜色:红色) MOV AH, 13H ; BIOS字符串输出中断 MOV AL, 00H ; 模式0:仅ASCII字符,光标不移动 MOV BH, 02H ; 显示页2 MOV BL, 04H ; 红色 MOV CX, STR_LEN ; 字符串长度 MOV DH, 240 ; Y坐标(屏幕中间) MOV DL, 300 ; X坐标(水平居中) LEA BP, REGISTRATION_NO ; 字符串偏移地址 INT 10H ; 等待按键后退出 MOV AH, 07H INT 21H ; 恢复文本模式 MOV AH, 00H MOV AL, 03H INT 10H ; 终止程序 MOV AH, 4CH INT 21H CODE ENDS END START
关键注意事项
- emu8086严格遵循MASM段定义规则,禁止使用NASM的
section指令 - 调用BIOS中断时,必须确保目标显示页号(BH寄存器)设置为2,对应PAGE-2
- 水平线坐标计算:640像素宽屏幕的中间位置是X=320,50像素长度的水平线起始X=320-25=295,结束X=320+24=344,保证水平居中
内容的提问来源于stack exchange,提问作者Vibhrat Vibhu Basnet
相关产品推荐
相关产品推荐

