You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用mReadAX宏需传入哪些参数可确保程序无错误运行?

mReadAX宏参数详解

这个宏是DOS汇编环境下用来读取十进制整数到AX寄存器的工具,你困惑的两个参数作用如下:

1. buffer:输入缓冲区

这是需要提前在数据段定义的一块内存区域,必须遵循DOS中断int 21h的0Ah号功能调用要求的格式:

  • 第1字节:存储缓冲区的最大容量(由size参数赋值)
  • 第2字节:由DOS自动填充,记录实际读取到的字符数量
  • 第3字节及以后:存储用户实际输入的字符(包括可能的负号)

示例定义:

data segment
    ; 定义最多容纳6个字符的缓冲区(5位数字+1个负号,适配AX的16位有符号整数范围)
    inputBuf db 6, ?, 6 dup(?)
data ends

2. size:缓冲区最大容量

这个参数是缓冲区能容纳的最大字符数,对应缓冲区第一个字节的值。它决定了用户最多可输入的字符数量(包括负号)。因为AX是16位有符号整数,范围为-32768到32767,最多需要5位数字,加上负号共6个字符,因此size通常设为6。

宏代码(格式化后)

mReadAX macro buffer, size
local input, startOfConvert, endOfConvert
    push bx
    push cx
    push dx
input:
    mov [buffer], size
    mov dx, offset [buffer]
    mov ah, 0Ah
    int 21h

    mov ah, 02h
    mov dl, 0Dh
    int 21h

    mov ah, 02h
    mov dl, 0Ah
    int 21h

    xor ah, ah
    cmp ah, [buffer][1]
    jz input

    xor cx, cx
    mov cl, [buffer][1]
    xor ax, ax
    xor bx, bx
    xor dx, dx
    mov bx, offset [buffer][2]
    cmp [buffer][2], '-'
    jne startOfConvert
    inc bx
    dec cl
startOfConvert:
    mov dx, 10
    mul dx
    cmp ax, 8000h
    jae input
    mov dl, [bx]  ; 注:原代码此处为[dx],属于笔误,正确应为[bx]
    sub dl, '0'
    add ax, dx
    cmp ax, 8000h
    jae input
    inc bx
    loop startOfConvert
    cmp [buffer][2], '-'
    jne endOfConvert
    neg ax
endOfConvert:
    pop dx
    pop cx
    pop bx
endm mReadAX

调用示例

在代码中调用宏时,传入你定义的缓冲区和对应容量即可:

mReadAX inputBuf, 6

内容的提问来源于stack exchange,提问作者Zakhar Axe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:50:30