调用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
相关产品推荐
相关产品推荐

