[原]“Int 13/AH = 02h”的一些说明

1。“int 13/ah=02h”的作用
把磁盘扇区读取到内存当中;也就是为了突破引导扇区的512字节限制,写一个loader程序,然后由引导扇区把这个loader程序加载到内存当中,loader程序实现实模式到保护模式的切换,从而不受内存大小限制的加载其它程序。
2。相关寄存器说明
AH = 02h:必须是该值;
AL=要读入的扇区的个数(一定不能为0);
CH=磁道号的低8位
CL=0-5位放起始扇区号,6-7位放磁道号的高2位(仅仅硬盘使用)
DH=磁头号
DL=驱动器号(第8位仅仅硬盘使用)
ES:BX->数据缓冲:读取出来的内容以ES:BX作为起始地址依次存储
3。返回值
如果访问出错则CF被置1,AX存放错误信息;
如果访问成功则CF被清零,AH存放状态,AL存放读入扇区数;
assume cs:code code segment start: ; 设置数据段寄存器 (DS = CS) push cs pop ds ;===== 加法部分 (5 + 3 = 8) ===== ; 显示提示信息 mov ah, 09h lea dx, add_str int 21h ; 计算并显示结果 mov ax, 05 ; 被加数设为5 mov bx, 03 ; 加数设为3 add ax, bx ; 计算5+3=8 ; 显示操作数和等号 mov dl, '5' int 21h mov dl, '+' int 21h mov dl, '3' int 21h mov dl, '=' int 21h ; 显示结果 mov dl, al ; 结果存入dl add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 换行 mov dl, 0Dh int 21h mov dl, 0Ah int 21h ;===== 减法部分 (5 - 3 = 2) ===== ; 显示提示信息 mov ah, 09h lea dx, sub_str int 21h ; 计算并显示结果 mov ax, 05 ; 被减数设为5 mov bx, 03 ; 减数设为3 sub ax, bx ; 计算5-3=2 ; 显示操作数和等号 mov dl, '5' int 21h mov dl, '-' int 21h mov dl, '3' int 21h mov dl, '=' int 21h ; 显示结果 mov dl, al ; 结果存入dl add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 换行 mov dl, 0Dh int 21h mov dl, 0Ah int 21h ;===== 乘法部分 (5 × 3 = 15) ===== ; 显示提示信息 mov ah, 09h lea dx, mul_str int 21h ; 计算并显示结果 mov al, 05 ; 被乘数设为5 mov bl, 03 ; 乘数设为3 mul bl ; 计算5×3=15,结果在AX中 ; 显示操作数和等号 mov dl, '5' int 21h mov dl, '*' int 21h mov dl, '3' int 21h mov dl, '=' int 21h ; 处理并显示两位数结果 aam ; 将AL中的二进制数转换为BCD格式 mov cx, ax ; 临时保存结果 ; 显示十位数(如果有) cmp ch, 0 jz skip_mul_ten mov dl, ch ; 十位数字 add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h skip_mul_ten: ; 显示个位数 mov dl, cl ; 个位数字 add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 换行 mov dl, 0Dh int 21h mov dl, 0Ah int 21h ;===== 除法部分 (5 / 3 = 1余2) ===== ; 显示提示信息 mov ah, 09h lea dx, div_str int 21h ; 计算并显示结果 mov ax, 5 ; 被除数设置为5 mov bl, 3 ; 除数设置为3 div bl ; 除法操作: AL=商, AH=余数 ; 显示操作数和等号 mov dl, '5' int 21h mov dl, '/' int 21h mov dl, '3' int 21h mov dl, '=' int 21h mov bh, ah ; 将余数保存到BH ; 显示商 mov dl, al ; 商在AL中 add dl, 30h ; 转换为ASCII mov ah, 02h int 21h ; 显示余数符号和余数 mov dl, 'r' int 21h mov dl, bh ; 余数在BH中 add dl, 30h ; 转换为ASCII mov ah, 02h int 21h ; 换行 mov dl, 0Dh int 21h mov dl, 0Ah int 21h ;===== 平方部分 (52 = 25) ===== ; 显示提示信息 mov ah, 09h lea dx, sqr_str int 21h ; 计算并显示结果 mov al, 05 ; 设置基数为5 mul al ; AL * AL -> AX (25) ; 显示操作数和等号 mov dl, '5' int 21h mov dl, 0B2h ; 上标2字符 int 21h mov dl, '=' int 21h ; 处理并显示两位数结果 aam ; 转换AX为十进制 mov cx, ax ; 临时保存结果 ; 显示十位数(如果有) cmp ch, 0 jz skip_sqr_ten mov dl, ch ; 十位(2) add dl, 30h mov ah, 02h int 21h skip_sqr_ten: ; 显示个位数 mov dl, cl ; 个位(5) add dl, 30h mov ah, 02h int 21h ; 换行 mov dl, 0Dh int 21h mov dl, 0Ah int 21h ;===== 程序结束 ===== mov ah, 4ch ; DOS功能调用:程序结束 int 21h ;===== 数据段 ===== add_str db '加法: $' sub_str db 0Dh, 0Ah, '减法: $' mul_str db 0Dh, 0Ah, '乘法: $' div_str db 0Dh, 0Ah, '除法: $' sqr_str db 0Dh, 0Ah, '平方: $' code ends end start 我要的显示结果是: 加法:5+3=8 减法:5-3=2 乘法:5*3=15 除法:5/3=1r2 平方:5*5=25
06-08
code segment assume cs:code start: ; 加法部分 (5 + 3 = 8) mov ax, 05 ; 被加数设为5 mov bx, 03 ; 加数设为3 add ax, bx ; 计算5+3=8 mov dl, al ; 结果存入dl add dl, 30h ; 转换为ASCII码 mov ah, 02h ; DOS功能调用:显示字符 int 21h ; 显示结果'8' ;下一行显示 mov dl, 0Dh ; 回车符 int 21h mov dl, 0Ah ; 换行符 int 21h ;—————————————————————————————————————— ; 减法部分 (5 - 3 = 2) mov ax, 05 ; 被减数设为5 mov bx, 03 ; 减数设为3 sub ax, bx ; 计算5-3=2 mov dl, al ; 结果存入dl add dl, 30h ; 转换为ASCII码 mov ah, 02h ; DOS功能调用:显示字符 int 21h ; 显示结果'2' ;下一行显示 mov dl, 0Dh ; 回车符 int 21h mov dl, 0Ah ; 换行符 int 21h ;—————————————————————————————————————— ; 乘法部分 (5 × 3 = 15) mov al, 05 ; 被乘数设为5 mov bl, 03 ; 乘数设为3 mul bl ; 计算5×3=15,结果在AX中 ; 处理乘法结果的两位数字 aam ; 将AL中的二进制数转换为BCD格式,AH=十位,AL=个位 mov cx, ax ; 临时保存结果 ; 显示十位数 mov dl, ch ; 十位数字 add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 显示十位数字 ; 显示个位数 mov dl, cl ; 个位数字 add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 显示个位数字 ;下一行显示 mov dl, 0Dh ; 回车符 int 21h mov dl, 0Ah ; 换行符 int 21h ;—————————————————————————————————————— ;除法部分 (5 / 3 = 1余2) mov ax, 5 ; 被除数设置为5 mov bl, 3 ; 除数设置为3 div bl ; 除法操作: AX / BL → AL=商, AH=余数 ; 5 ÷ 3 = 商1 (AL), 余数2 (AH) mov bh, ah ; 将余数保存到bH ; 显示商 mov dl, al ; 商在AL中 add dl, 30h ; 转换为ASCII mov ah, 02h int 21h ; 显示商(1) ; 显示分隔符 "R" (表示余数) mov dl, 'R' int 21h ; 显示"R" ; 显示余数 mov dl, bh ; 余数在BH中 add dl, 30h ; 转换为ASCII mov ah, 02h int 21h ; 显示余数(2) ;下一行显示 mov dl, 0Dh ; 回车符 int 21h mov dl, 0Ah ; 换行符 int 21h ;—————————————————————————————————————— ;平方部分 mov al, 05 ; 设置基数为5 mul al ; AL * AL -> AX (25) aam ; 转换AX为十进制:AH=2, AL=5 mov cx, ax ; 保存结果 ; 显示十位数 mov dl, ch ; 十位(2) add dl, 30h ; 转ASCII mov ah, 02h int 21h ; 显示个位数 mov dl, cl ; 个位(5) add dl, 30h int 21h ;下一行显示 mov dl, 0Dh ; 回车符 int 21h mov dl, 0Ah ; 换行符 int 21h ;—————————————————————————————————————— ; 程序结束 mov ah, 4ch ; DOS功能调用:程序结束 int 21h code ends end start 调整结果显示,比如加法调整为“加法:5+3=8”
最新发布
06-09
code segment assume cs:code start: ; 加法部分 (5 + 3 = 8) mov ax, 05 ; 被加数设为5 mov bx, 03 ; 加数设为3 add ax, bx ; 计算5+3=8 mov dl, al ; 结果存入dl add dl, 30h ; 转换为ASCII码 mov ah, 02h ; DOS功能调用:显示字符 int 21h ; 显示结果'8' ; 显示分隔逗号 mov dl, ',' int 21h ; 显示逗号 ;—————————————————————————————————————— ; 减法部分 (5 - 3 = 2) mov ax, 05 ; 被减数设为5 mov bx, 03 ; 减数设为3 sub ax, bx ; 计算5-3=2 mov dl, al ; 结果存入dl add dl, 30h ; 转换为ASCII码 mov ah, 02h ; DOS功能调用:显示字符 int 21h ; 显示结果'2' ; 显示分隔逗号 mov dl, ',' int 21h ; 显示逗号 ;—————————————————————————————————————— ; 乘法部分 (5 × 3 = 15) mov al, 05 ; 被乘数设为5 mov bl, 03 ; 乘数设为3 mul bl ; 计算5×3=15,结果在AX中 ; 处理乘法结果的两位数字 aam ; 将AL中的二进制数转换为BCD格式,AH=十位,AL=个位 mov cx, ax ; 临时保存结果 ; 显示十位数 mov dl, ch ; 十位数字 add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 显示十位数字 ; 显示个位数 mov dl, cl ; 个位数字 add dl, 30h ; 转换为ASCII码 mov ah, 02h int 21h ; 显示个位数字 ; 显示分隔逗号 mov dl, ',' int 21h ; 显示逗号 ;—————————————————————————————————————— ;除法部分 (5 / 3 = 1余2) mov ax, 5 ; 被除数设置为5 mov bl, 3 ; 除数设置为3 div bl ; 除法操作: AX / BL → AL=商, AH=余数 ; 5 ÷ 3 = 商1 (AL), 余数2 (AH) mov bh, ah ; 将余数保存到bH ; 显示商 mov dl, al ; 商在AL中 add dl, 30h ; 转换为ASCII mov ah, 02h int 21h ; 显示商(1) ; 显示分隔符 "R" (表示余数) mov dl, 'R' int 21h ; 显示"R" ; 显示余数 mov dl, bh ; 余数在BH中 add dl, 30h ; 转换为ASCII mov ah, 02h int 21h ; 显示余数(2) ; 显示分隔逗号 mov dl, ',' int 21h ; 显示逗号 ;—————————————————————————————————————— ;平方部分 mov al, 05 ; 设置基数为5 mul al ; AL * AL -> AX (25) aam ; 转换AX为十进制:AH=2, AL=5 mov cx, ax ; 保存结果 ; 显示十位数 mov dl, ch ; 十位(2) add dl, 30h ; 转ASCII mov ah, 02h int 21h ; 显示个位数 mov dl, cl ; 个位(5) add dl, 30h int 21h ; 显示分隔逗号 mov dl, ',' int 21h ;—————————————————————————————————————— ; 程序结束 mov ah, 4ch ; DOS功能调用:程序结束 int 21h code ends end start 让上面代码输出结果换行显示
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值