求助:as86编译汇编引导代码时出现'as: error reading input'错误
解决as86编译时
as: error reading input的问题 可能的原因及解决方案
1. 确认bin86工具包已安装
Ubuntu默认不包含as86,需先安装对应工具包:
sudo apt update && sudo apt install bin86
2. 检查文件路径与权限
确保在ts.s所在目录执行编译命令,或用绝对路径指定文件:
as86 /绝对路径/ts.s -o ts.o
注:若文件权限正常,无需使用sudo,普通用户权限即可完成编译。
3. 修正汇编语法问题
as86采用Minix风格的8086汇编语法,你的代码存在几处语法不兼容点,这是触发错误的核心原因:
- as86中立即数前缀为
$而非#,需将所有#替换为$,例如:movb ah, $2 // 原代码:movb ah, #2 movb al, $BSECTORS // 原代码:movb al, #BSECTORS push $msg // 原代码:push #msg - 补充未定义符号:
_NSEC、_main、_prints在当前代码中未定义,需在当前文件补充常量定义(如_NSEC = 1),或确保这些符号存在于关联编译文件中。
4. 验证编译命令格式
正确的as86编译命令格式:
as86 ts.s -o ts.o
若需生成纯8086模式的16位目标文件,可添加-0参数:
as86 -0 ts.s -o ts.o
修改后的示例代码片段
.globl _main,_prints,_NSEC .globl _getc,_putc,_readfd,_setes,_inces, _error BOOTSEG = 0x9800 OSSEG = 0x1000 SSP = 32*1024 BSECTORS = 2 _NSEC = 1 // 补充未定义的常量 start: mov ax, BOOTSEG mov es, ax xor dx, dx xor cx, cx incb cl xor bx, bx movb ah, $2 movb al, $BSECTORS int 0x13 jmpi next, BOOTSEG next: mov ax, cs mov ds, ax mov ss, ax mov sp, $SSP call _main jmpi 0, OSSEG _getc: xorb ah, ah int 0x16 ret _putc: push bp mov bp, sp movb al, 4[bp] movb ah, $14 int 0x10 pop bp ret _readfd: push bp mov bp, sp movb dl, $0x00 movb dh, 6[bp] movb cl, 8[bp] incb cl movb ch, 4[bp] xor bx, bx movb ah, $0x02 movb al, _NSEC int 0x13 jb _error pop bp ret _setes: push bp mov bp, sp mov ax, 4[bp] mov es, ax pop bp ret _inces: mov bx, _NSEC shl bx, $5 mov ax, es add ax, bx mov es, ax ret _error: push $msg call _prints int 0x19 msg: .asciz "Error"
内容的提问来源于stack exchange,提问作者Saleh Hatefinya
相关产品推荐
相关产品推荐

