如何用TASM汇编语言实现表格形式输出库存与数量数据
TASM 表格形式输出库存信息
先给出你提供的原始数据定义:
.model small .stack 100h .data inventory db 10, 'Apples','Oranges','Potatoes','Tomatoes','Onions','Lemons','Milk','Eggs','Bread','Cheese',10,0 quantity db 5, 3, 8, 6, 4, 2, 1, 10, 2, 7, 9
针对需求:需要实现以表格形式输出序号、库存名称、对应数量,输出样式参考如下规整结构:
序号 | 库存名称 | 数量 ------------------------ 1 | Apples | 5 2 | Oranges | 3 3 | Potatoes | 8 ...
以下是完整实现代码,包含核心逻辑和对齐处理:
.model small .stack 100h .data inventory db 10, 'Apples','Oranges','Potatoes','Tomatoes','Onions','Lemons','Milk','Eggs','Bread','Cheese',10,0 quantity db 5, 3, 8, 6, 4, 2, 1, 10, 2, 7, 9 header db '序号 | 库存名称 | 数量',0Dh,0Ah,'------------------------',0Dh,0Ah,0 separator db ' | ',0 newline db 0Dh,0Ah,0 .code main proc mov ax, @data mov ds, ax ; 打印表头 lea dx, header call print_string ; 初始化计数器与指针 mov cx, 0 lea si, inventory inc si ; 跳过开头的条目数字节 lea di, quantity print_loop: inc cx ; 序号自增 ; 打印序号 mov ax, cx call print_number ; 打印分隔符 lea dx, separator call print_string ; 打印库存名称 call print_item_name ; 打印分隔符 lea dx, separator call print_string ; 打印数量 mov al, [di] cbw call print_number ; 打印换行 lea dx, newline call print_string inc di cmp cx, 10 ; 遍历完10个条目后退出 jl print_loop ; 程序退出 mov ah, 4Ch int 21h main endp ; 打印以0结尾的字符串,dx指向字符串首地址 print_string proc push ax print_str_loop: mov al, [dx] cmp al, 0 je print_str_end mov ah, 0Eh int 10h inc dx jmp print_str_loop print_str_end: pop ax ret print_string endp ; 打印十进制数字(0-99),ax存储待打印数字 print_number proc push bx push cx push dx mov cx, 0 mov bx, 10 number_loop: xor dx, dx div bx push dx inc cx cmp ax, 0 jne number_loop print_digits: pop dx add dl, '0' mov ah, 0Eh int 10h loop print_digits ; 个位数补空格对齐 cmp cx, 1 jne number_end mov dl, ' ' mov ah, 0Eh int 10h number_end: pop dx pop cx pop bx ret print_number endp ; 打印单个库存名称并补空格对齐,si指向名称首地址 print_item_name proc push ax push si mov bx, si ; 定位当前名称的第一个大写字母(区分下一个名称的起始) name_find_start: mov al, [bx] inc bx cmp al, 'A' jb name_find_start cmp al, 'Z' ja name_find_start print_name_char: mov al, [si] ; 遇到非当前名称开头的大写字母则停止 cmp al, 'A' jge check_upper mov ah, 0Eh int 10h inc si jmp print_name_char check_upper: cmp al, 'Z' jle name_end mov ah, 0Eh int 10h inc si jmp print_name_char name_end: ; 补空格使名称列宽度统一为8字符 mov ax, si sub ax, [bp-2] mov cx, 8 sub cx, ax align_space: cmp cx, 0 jle align_end mov dl, ' ' mov ah, 0Eh int 10h dec cx jmp align_space align_end: pop si pop ax ret print_item_name endp end main
关键逻辑说明
- 表头与格式控制:通过定义表头字符串和分隔符,保证表格结构清晰;使用换行符
0Dh,0Ah实现回车换行。 - 循环遍历:用
cx作为序号计数器,遍历10个库存条目,同步移动si(库存名称指针)和di(数量指针)。 - 字符与数字输出:调用BIOS的
int 10h中断实现字符打印,数字需先转换为ASCII码,个位数补空格保证列对齐。 - 库存名称分割:通过识别大写字母判断下一个名称的起始位置,同时补空格让名称列宽度一致,确保表格规整。
内容的提问来源于stack exchange,提问作者Zhi Zheng
相关产品推荐
相关产品推荐

