汇编语言实现99乘法表
下面是使用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码输出到屏幕上,然后输出行号和列号。最后程序调用系统调用退出程序
原文地址: https://www.cveoy.top/t/topic/fQT7 著作权归作者所有。请勿转载和采集!