下面是使用x86汇编语言实现的99乘法表:

section .data
    num db 1 ; 乘数
    row db 1 ; 行数
    col db 1 ; 列数

section .text
    global _start

_start:
    mov ecx, 9 ; 循环9次
    mov ebx, 1 ; 列数从1开始

outer_loop:
    mov eax, ecx ; 乘数从9开始
    mov [num], eax ; 存储乘数
    mov [row], ecx ; 存储行数
    mov [col], ebx ; 存储列数

inner_loop:
    mov eax, [num] ; 读取乘数
    mov ebx, [col] ; 读取列数
    mul ebx ; 乘法运算
    mov edx, 0 ; 清空余数

    ; 输出结果
    ; 将行数和列数转换成ASCII码
    ; 并输出到屏幕上
    push eax ; 保存乘积
    push word [col] ; 列数
    push word [row] ; 行数
    call print_num ; 调用输出函数
    add esp, 6 ; 恢复栈指针

    inc byte [col] ; 列数加1
    cmp byte [col], 10 ; 判断列数是否大于9
    jle inner_loop ; 如果不大于9,继续内循环

    inc byte [row] ; 行数加1
    cmp byte [row], 10 ; 判断行数是否大于9
    jle outer_loop ; 如果不大于9,继续外循环

    ; 退出程序
    mov eax, 1 ; 系统调用退出程序
    xor ebx, ebx ; 返回值为0
    int 0x80 ; 调用系统中断

; 输出函数
; 输入:AX-乘积;BX-列数;CX-行数
; 输出:屏幕上输出乘积
print_num:
    pusha ; 保存寄存器
    mov ecx, 10 ; 除数为10
    mov ebx, 0 ; 商的初始值为0

    ; 循环计算商和余数
    loop_div:
        xor edx, edx ; 清空余数
        div ecx ; 除法运算
        push dx ; 保存余数
        inc bl ; 商加1
        cmp ax, 0 ; 判断是否除尽
        jne loop_div ; 如果没除尽,继续循环

    ; 输出结果
    ; 将余数依次弹出并转换成ASCII码输出
    ; 然后输出行号和列号
    mov ecx, 3 ; 循环3次
    loop_print:
        pop dx ; 弹出余数
        add dl, '0' ; 转换成ASCII码
        mov ah, 0x0E ; AH寄存器为0x0E表示打印字符
        int 0x10 ; 调用BIOS中断输出字符
        dec bl ; 商减1
        cmp bl, 0 ; 判断商是否为0
        jne loop_print ; 如果不为0,继续循环

    ; 输出列号和行号
    add bx, '0' ; 将列号转换成ASCII码
    mov ah, 0x0E ; AH寄存器为0x0E表示打印字符
    int 0x10 ; 调用BIOS中断输出字符
    add cx, '0' ; 将行号转换成ASCII码
    mov ah, 0x0E ; AH寄存器为0x0E表示打印字符
    int 0x10 ; 调用BIOS中断输出字符

    popa ; 恢复寄存器
    ret ; 返回

该程序使用了两层循环,外层循环控制行数,内层循环控制列数。在内层循环中,使用乘法运算计算乘积,并调用输出函数将结果输出到屏幕上。输出函数中使用除法运算计算商和余数,并将余数转换成ASCII码输出到屏幕上,然后输出行号和列号。最后程序调用系统调用退出程序

汇编语言实现99乘法表

原文地址: https://www.cveoy.top/t/topic/fQT7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录