包含Irvine32.inc报错的问题

本文介绍了解决使用Irvine32库时遇到的错误,包括错误A2071和warningA4011等问题。通过删除重复的.model指令解决了错误,并提供了一个示例代码,展示了如何正确地使用该库进行控制台窗口颜色更改及数字转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:目前开通个人网站朝思录,之后的博文将在上面更新,优快云博客会滞后一点


之前学汇编使用了作者提供的Irvine32库,但总是报错如下:

1>c:\Irvine\SmallWin.inc(11): error A2071: initializer magnitude too large for specified size
1>c:\Irvine\SmallWin.inc(11): warning A4011: multiple .MODEL directives found : .MODEL ignored
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\masm.targets(50,5): error MSB3721: 命令“ml.exe /c /nologo /Sg /WX /Zi /Fo"Debug\Chapter5.obj" /Fl".lst" /I "c:\Irvine" /W3 /errorReport:prompt  /Ta"..\..\..\Users\Eastwind\Do
cuments\《汇编语言-基于x86处理器》资料\Test\Chapter5.asm"”已退出,返回代码为 1。

这个错误的出现是因为在程序中出现了这样的语句:

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD

貌似Irvine32.inc已经包含以上语句了,如果再包含,会出现重复。所以删掉它就好了。


另附可用的包含Irvine32.inc的代码如下(书上例程),其功能是改变控制台窗口颜色,并可以以十进制方式输入4个32位数字,显示它的Dec,Hex,Bin:

include Irvine32.inc

.data
COUNT = 4
BlueTextOnGray = blue + (lightGray * 16)
DefaultColor = lightGray + (black * 16)
arrayD SDWORD 12345678h,1A4B2000h,3434h,7AB9h
prompt BYTE "Enter a 32-bit signed integer: ",0
.code
main PROC
    mov eax,BlueTextOnGray
    call SetTextColor
    call Clrscr

    mov esi,OFFSET arrayD
    mov ebx,TYPE arrayD
    mov ecx,LENGTHOF arrayD
    call DumpMem

    call Crlf
    mov ecx,COUNT

L1: mov edx,OFFSET prompt
    call WriteString
    call ReadInt
    call Crlf

    call WriteInt
    call Crlf
    call WriteHex
    call Crlf
    call WriteBin
    call Crlf
    call Crlf
    loop L1

    call WaitMsg
    mov eax,DefaultColor
    call SetTextColor
    call Clrscr

    exit

main ENDP
END main

运行结果如下图:
这里写图片描述


注:书是《汇编语言-基于x86处理器》

; 段声明(参考引用[1]结构) data segment prompt db 0dh,0ah,'Input binary (q to exit): $' buffer db 20,?,20 dup(?) ; 输入缓冲区 output db 10 dup(' '),'$' ; 十进制输出缓冲区 errmsg db 0dh,0ah,'Invalid input!$' data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax main_loop: ; 显示提示信息 mov ah,09h lea dx,prompt int 21h ; 读取输入(参考引用[1]中断调用) mov ah,0ah lea dx,buffer int 21h ; 检查退出条件 cmp buffer+2,'q' je exit_program ; 二进制转十进制 call bin2dec jc invalid_input ; 显示十进制结果 call show_dec jmp main_loop invalid_input: mov ah,09h lea dx,errmsg int 21h jmp main_loop exit_program: mov ax,4c00h ; 参考引用[1]退出方式 int 21h ; 二进制转十进制子程序 bin2dec proc xor bx,bx ; 存储二进制值 mov si,2 ; 输入起始位置 mov cl,buffer+1; 输入长度 convert_loop: mov al,[si] cmp al,'0' jb error cmp al,'1' ja error sub al,30h ; ASCII转数字 shl bx,1 ; 左移相当于*2 add bl,al inc si dec cl jnz convert_loop ; 将二进制值转为十进制字符串 mov ax,bx lea di,output+9 ; 从缓冲区末尾填充 mov cx,10 ; 除数 std ; 逆向存储 dec_loop: xor dx,dx div cx ; ax/10,余数在dx add dl,30h ; 转为ASCII mov [di],dl dec di test ax,ax jnz dec_loop clc ret error: stc ret bin2dec endp ; 显示十进制结果 show_dec proc mov ah,02h mov dl,0dh ; 回车 int 21h mov dl,0ah ; 换行 int 21h lea si,output ; 跳过前导空格(参考引用[2]指针操作) skip_space: cmp byte ptr [si],' ' jne print_num inc si jmp skip_space print_num: mov ah,02h print_loop: mov dl,[si] cmp dl,'$' je end_print int 21h inc si jmp print_loop end_print: ret show_dec endp code ends end start此代码为什么输入二进制数时显示Invalid input!应该怎么修改并给出修改后的完整代码
最新发布
05-30
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值