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

如何用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

关键逻辑说明

  1. 表头与格式控制:通过定义表头字符串和分隔符,保证表格结构清晰;使用换行符0Dh,0Ah实现回车换行。
  2. 循环遍历:用cx作为序号计数器,遍历10个库存条目,同步移动si(库存名称指针)和di(数量指针)。
  3. 字符与数字输出:调用BIOS的int 10h中断实现字符打印,数字需先转换为ASCII码,个位数补空格保证列对齐。
  4. 库存名称分割:通过识别大写字母判断下一个名称的起始位置,同时补空格让名称列宽度一致,确保表格规整。

内容的提问来源于stack exchange,提问作者Zhi Zheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:11:28