[原]“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
.MODEL SMALL .STACK 100h .DATA ; === 菜单与提示信息 === szMenuTitle DB 13,10,'========== FUNCTION SELECTION MENU ==========',13,10,'$' szOption1 DB 13,10,' 1. Show Current Time ',13,10,'$' szOption2 DB 13,10,' 2. Draw Rectangle ',13,10,'$' szOption3 DB 13,10,' 3. Perform Math Calculation ',13,10,'$' szOption4 DB 13,10,' 4. Reverse Input String ',13,10,'$' szOption5 DB 13,10,' 5. Exit Program ',13,10,'$' szMenuEnd DB 13,10,'===========================================',13,10,'$' szPrompt DB 13,10,'Please choose an option (1-5): $' szInvalid DB 13,10,'Invalid input! Press any key to retry...$' ; === 时间显示相关 === szTimeLabel DB 13,10,'Current Time is: $' szTimeBuffer DB '00:00:00$',0 ; === 图形绘制参数 === szTopBottom DB '----------------------------------------$' ; 宽度约40字符 szSideChar DB '|$' szSpace DB ' $' ; === 数学运算提示 === szMathTitle DB 13,10,'===== MATHEMATICAL OPERATION =====',13,10,'$' szOpSelect DB 13,10,'Choose operation: 1=Add 2=Sub 3=Mult 4=Div : $' szInputFirst DB 13,10,'Enter first number: $' szInputSecond DB 13,10,'Enter second number: $' szResultOut DB 13,10,'Result = $' szRemainOut DB 13,10,'Remainder = $' szZeroDivErr DB 13,10,'Error: Division by zero not allowed!$' ; === 字符串处理相关 === szStrTitle DB 13,10,'===== STRING REVERSAL =====',13,10,'$' szStrPrompt DB 13,10,'Input string (max 50 chars): $' szOrigShow DB 13,10,'Original: $' szRevShow DB 13,10,'Reversed: $' ; === 缓冲区与变量 === InputBuf DB 51, ?, 51 DUP('$') RevBuf DB 51 DUP('$') numA DW ? numB DW ? resultVal DW ? tempDigit DW ? ; === 返回提示 === szReturnKey DB 13,10,13,10,'Press any key to continue...$' .CODE ; 主入口 START: MOV AX, @DATA MOV DS, AX BEGIN_LOOP: CALL ClearScreen CALL ShowMainMenu MOV AH, 01h ; 读取按键 INT 21h CMP AL, '1' JE TIME_MODULE CMP AL, '2' JE GRAPH_MODULE CMP AL, '3' JE MATH_MODULE CMP AL, '4' JE STRING_MODULE CMP AL, '5' JE QUIT_PROGRAM ; 错误输入处理 MOV AH, 09h LEA DX, szInvalid INT 21h CALL WaitAnyKey JMP BEGIN_LOOP ; =================================== ; 功能1:显示系统时间 ; 使用 INT 21H AH=2Ch 获取时间 ; =================================== TIME_MODULE: CALL ClearScreen LEA DX, szTimeLabel MOV AH, 09h INT 21h MOV AH, 2Ch ; 获取系统时间 INT 21h ; CH=小时, CL=分钟, DH=秒 ; 处理小时 MOV AL, CH CALL BinToTwoAscii MOV szTimeBuffer[0], AL MOV szTimeBuffer[1], AH ; 处理分钟 MOV AL, CL CALL BinToTwoAscii MOV szTimeBuffer[3], AL MOV szTimeBuffer[4], AH ; 处理秒 MOV AL, DH CALL BinToTwoAscii MOV szTimeBuffer[6], AL MOV szTimeBuffer[7], AH LEA DX, szTimeBuffer MOV AH, 09h INT 21h CALL WaitAnyKey JMP BEGIN_LOOP ; =================================== ; 功能2:绘制矩形框 ; 在指定位置画边框 ; =================================== GRAPH_MODULE: CALL ClearScreen MOV AH, 02h ; 设置光标位置 (Row=6, Col=15) MOV BH, 0 MOV DH, 6 MOV DL, 15 INT 10h LEA DX, szTopBottom ; 上边框 MOV AH, 09h INT 21h MOV CX, 8 ; 侧边高度 DRAW_SIDES_LOOP: PUSH CX MOV AH, 02h ; 左竖线 MOV DL, 15 INT 10h LEA DX, szSideChar MOV AH, 09h INT 21h MOV AH, 02h ; 右竖线 MOV DL, 15 + 40 - 1 INT 10h LEA DX, szSideChar MOV AH, 09h INT 21h MOV AH, 0Ah ; 换行 MOV DL, 13 MOV AH, 02h INT 21h POP CX LOOP DRAW_SIDES_LOOP MOV AH, 02h ; 下边框定位 MOV DH, 6 + 9 MOV DL, 15 INT 10h LEA DX, szTopBottom MOV AH, 09h INT 21h CALL WaitAnyKey JMP BEGIN_LOOP ; =================================== ; 功能3:数学运算模块 ; 支持四则运算 ; =================================== MATH_MODULE: CALL ClearScreen LEA DX, szMathTitle MOV AH, 09h INT 21h LEA DX, szOpSelect MOV AH, 09h INT 21h MOV AH, 01h INT 21h CMP AL, '1' JE DO_ADD CMP AL, '2' JE DO_SUB CMP AL, '3' JE DO_MUL CMP AL, '4' JE DO_DIV JMP MATH_MODULE DO_ADD: CALL GetTwoNumbers MOV AX, numA ADD AX, numB MOV resultVal, AX CALL ShowResultOnly JMP MATH_END DO_SUB: CALL GetTwoNumbers MOV AX, numA SUB AX, numB MOV resultVal, AX CALL ShowResultOnly JMP MATH_END DO_MUL: CALL GetTwoNumbers MOV AX, numA MUL numB MOV resultVal, AX CALL ShowResultOnly JMP MATH_END DO_DIV: CALL GetTwoNumbers CMP numB, 0 JE DIV_ERROR MOV AX, numA XOR DX, DX DIV numB MOV resultVal, AX MOV tempDigit, DX CALL ShowQuotientAndRemainder JMP MATH_END DIV_ERROR: LEA DX, szZeroDivErr MOV AH, 09h INT 21h CALL WaitAnyKey JMP MATH_MODULE MATH_END: CALL WaitAnyKey JMP BEGIN_LOOP ; =================================== ; 功能4:字符串反转 ; 输入后反向输出 ; =================================== STRING_MODULE: CALL ClearScreen LEA DX, szStrTitle MOV AH, 09h INT 21h LEA DX, szStrPrompt MOV AH, 09h INT 21h LEA DX, InputBuf MOV AH, 0Ah INT 21h ; 显示文 LEA DX, szOrigShow MOV AH, 09h INT 21h MOV SI, OFFSET InputBuf + 2 MOV CL, InputBuf[1] MOV CH, 0 CALL PrintStringAtSI ; 反转 LEA SI, InputBuf + 2 LEA DI, RevBuf ADD DI, CX DEC DI MOV BX, CX SHR BX, 1 ; 循环次数 = 长度 / 2 REVERSE_CHAR_LOOP: MOV AL, [SI] MOV AH, [DI] MOV [SI], AH MOV [DI], AL INC SI DEC DI DEC BX JNZ REVERSE_CHAR_LOOP ; 添加结束符 MOV BYTE PTR [DI+1], '$' ; 显示反转结果 LEA DX, szRevShow MOV AH, 09h INT 21h LEA DX, RevBuf MOV AH, 09h INT 21h CALL WaitAnyKey JMP BEGIN_LOOP ; =================================== ; 子程序定义区 ; =================================== ; 清屏 ClearScreen PROC MOV AH, 06h MOV AL, 0 MOV BH, 07h MOV CX, 0 MOV DX, 184Fh INT 10h RET ClearScreen ENDP ; 显示主菜单 ShowMainMenu PROC LEA DX, szMenuTitle MOV AH, 09h INT 21h LEA DX, szOption1 INT 21h LEA DX, szOption2 INT 21h LEA DX, szOption3 INT 21h LEA DX, szOption4 INT 21h LEA DX, szOption5 INT 21h LEA DX, szMenuEnd INT 21h LEA DX, szPrompt INT 21h RET ShowMainMenu ENDP ; 等待任意键 WaitAnyKey PROC LEA DX, szReturnKey MOV AH, 09h INT 21h MOV AH, 07h INT 21h RET WaitAnyKey ENDP ; 二进制转ASCII(0~99) BinToTwoAscii PROC XOR AH, AH MOV BL, 10 DIV BL ADD AL, '0' ADD AH, '0' RET BinToTwoAscii ENDP ; 获取两个数字 GetTwoNumbers PROC CALL ReadNumberFromUser MOV numA, BX CALL ReadNumberFromUser MOV numB, BX RET GetTwoNumbers ENDP ; 读取一个数 ReadNumberFromUser PROC PUSH AX PUSH CX PUSH DX MOV BX, 0 READ_LOOP: MOV AH, 01h INT 21h CMP AL, 13 JE DONE_READ CMP AL, '0' JB READ_LOOP CMP AL, '9' JA READ_LOOP SUB AL, '0' MOV AH, 0 PUSH AX MOV AX, BX MOV CX, 10 MUL CX MOV BX, AX POP AX ADD BX, AX JMP READ_LOOP DONE_READ: POP DX POP CX POP AX RET ReadNumberFromUser ENDP ; 仅显示结果 ShowResultOnly PROC LEA DX, szResultOut MOV AH, 09h INT 21h MOV AX, resultVal CALL PrintAXAsDecimal RET ShowResultOnly ENDP ; 显示商和余数 ShowQuotientAndRemainder PROC LEA DX, szResultOut MOV AH, 09h INT 21h MOV AX, resultVal CALL PrintAXAsDecimal LEA DX, szRemainOut MOV AH, 09h INT 21h MOV AX, tempDigit CALL PrintAXAsDecimal RET ShowQuotientAndRemainder ENDP ; 打印AX中的十进制数 PrintAXAsDecimal PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV CX, 0 MOV BX, 10 PRT_LOOP: XOR DX, DX DIV BX PUSH DX INC CX OR AX, AX JNZ PRT_LOOP OUT_LOOP: POP DX ADD DL, '0' MOV AH, 02h INT 21h LOOP OUT_LOOP POP DX POP CX POP BX POP AX RET PrintAXAsDecimal ENDP ; 打印SI指向的CL长度字符串(手动添加换行) PrintStringAtSI PROC PUSH AX PUSH CX PUSH SI PRINT_SILoop: MOV AL, [SI] MOV DL, AL MOV AH, 02h INT 21h INC SI LOOP PRINT_SILoop POP SI POP CX POP AX RET PrintStringAtSI ENDP ; 程序退出 QUIT_PROGRAM: MOV AH, 4Ch INT 21h END START
最新发布
12-26
; 电子时钟程序(8086汇编,DOS环境) ; 功能:24小时制时钟,支持手动输入/获取系统时间,输入校验,按任意键退出 ; 依赖:DOSBox,调用DOS/BIOS中断 DATA SEGMENT ; 菜单及提示信息 MENU_MSG DB 0AH,0DH,'===== 电子时钟初始化选择 =====',0AH,0DH DB '1. 手动输入初始时间(格式:HH:MM:SS)',0AH,0DH DB '2. 自动获取系统时钟',0AH,0DH DB '请输入选择(1/2):$' INPUT_PROMPT DB 0AH,0DH,'请输入初始时间(HH:MM:SS):$' ERROR_MSG DB 0AH,0DH,'输入错误!请重新操作。$' ; 时间变量(二进制存储,范围:HOUR[0-23], MIN[0-59], SEC[0-59]) HOUR DB ? ; 小时 MIN DB ? ; 分钟 SEC DB ? ; 秒 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: ; 【关键】设置显示模式为“80列×25行文本模式”(避免乱码) MOV AH, 00H MOV AL, 03H INT 10H ; 初始化数据段 MOV AX, DATA MOV DS, AX ; -------------------------- 步骤1:显示菜单,选择初始化方式 -------------------------- MENU_LOOP: ; 显示菜单 MOV AH, 09H LEA DX, MENU_MSG INT 21H ; 读取用户选择 MOV AH, 01H INT 21H ; 判断选择 CMP AL, '1' JE INPUT_TIME_MODE ; 手动输入时间 CMP AL, '2' JE SYS_TIME_MODE ; 获取系统时间 ; 输入非法,提示错误并重新显示菜单 MOV AH, 09H LEA DX, ERROR_MSG INT 21H JMP MENU_LOOP ; -------------------------- 步骤2:初始化时间(两种方式) -------------------------- INPUT_TIME_MODE: ; 方式1:手动输入初始时间(含合法性验证) CALL INPUT_TIME JMP CLOCK_MAIN SYS_TIME_MODE: ; 方式2:获取系统实时时钟 CALL GET_SYSTEM_TIME JMP CLOCK_MAIN ; -------------------------- 步骤3:时钟主循环(显示+更新+按键检测) -------------------------- CLOCK_MAIN: CALL DISPLAY_CLOCK ; 显示当前时间 CALL DELAY_1S ; 延时1秒 CALL UPDATE_TIME ; 更新时间(处理进位) CALL CHECK_KEY ; 检查键盘输入(按任意键退出) JMP CLOCK_MAIN ; 循环执行 ; -------------------------- 步骤4:退出程序 -------------------------- EXIT_PROG: MOV AH, 4CH INT 21H ; ================================================================================== ; 子程序1:GET_SYSTEM_TIME(获取系统实时时钟) ; ================================================================================== GET_SYSTEM_TIME PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX GET_RETRY: ; BIOS中断INT 1Ah读取RTC(CH=小时BCD,CL=分钟BCD,DH=秒BCD) MOV AH, 02H INT 1Ah JC GET_RETRY ; 读取失败则重试 ; BCD码转二进制 ; 处理小时 MOV AL, CH CALL BCD_TO_BIN MOV HOUR, AL ; 处理分钟 MOV AL, CL CALL BCD_TO_BIN MOV MIN, AL ; 处理秒 MOV AL, DH CALL BCD_TO_BIN MOV SEC, AL POP DX POP CX POP BX POP AX RET GET_SYSTEM_TIME ENDP ; ================================================================================== ; 子程序2:BCD_TO_BIN(BCD码转二进制) ; ================================================================================== BCD_TO_BIN PROC NEAR PUSH BX PUSH CX MOV BL, AL AND BL, 0FH ; 提取个位 MOV CL, 4 SHR AL, CL ; 提取十位 MOV CL, 10 MUL CL ; 十位×10 ADD AL, BL ; 十位×10 + 个位 POP CX POP BX RET BCD_TO_BIN ENDP ; ================================================================================== ; 子程序3:INPUT_TIME(手动输入初始时间,含校验) ; ================================================================================== INPUT_TIME PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX INPUT_AGAIN: ; 显示输入提示 MOV AH, 09H LEA DX, INPUT_PROMPT INT 21H ; -------------------------- 输入小时(HH) -------------------------- CALL INPUT_2DIGIT ; 调用两位数字输入子程序 JC INPUT_ERROR MOV HOUR, AL CMP AL, 23 ; 小时范围0-23 JA INPUT_ERROR ; -------------------------- 检查第一个冒号(:) -------------------------- CALL CHECK_COLON JC INPUT_ERROR ; -------------------------- 输入分钟(MM) -------------------------- CALL INPUT_2DIGIT JC INPUT_ERROR MOV MIN, AL CMP AL, 59 ; 分钟范围0-59 JA INPUT_ERROR ; -------------------------- 检查第二个冒号(:) -------------------------- CALL CHECK_COLON JC INPUT_ERROR ; -------------------------- 输入秒(SS) -------------------------- CALL INPUT_2DIGIT JC INPUT_ERROR MOV SEC, AL CMP AL, 59 ; 秒范围0-59 JA INPUT_ERROR ; 输入合法,返回 POP DX POP CX POP BX POP AX RET INPUT_ERROR: ; 输入非法,提示并重新输入 MOV AH, 09H LEA DX, ERROR_MSG INT 21H JMP INPUT_AGAIN INPUT_TIME ENDP ; ================================================================================== ; 子程序4:INPUT_2DIGIT(输入两位数字并校验) ; ================================================================================== INPUT_2DIGIT PROC NEAR PUSH BX ; 读取十位 MOV AH, 01H INT 21H CALL IS_DIGIT JC INPUT_2DIGIT_ERR MOV BL, AL SUB BL, 30H ; ASCII转数值 ; 读取个位 MOV AH, 01H INT 21H CALL IS_DIGIT JC INPUT_2DIGIT_ERR SUB AL, 30H ; ASCII转数值 ; 组合十位×10 + 个位 MOV CL, 10 MUL CL ADD AL, BL POP BX CLC ; 清进位(合法) RET INPUT_2DIGIT_ERR: STC ; 置进位(非法) RET INPUT_2DIGIT ENDP ; ================================================================================== ; 子程序5:IS_DIGIT(检查字符是否为数字) ; ================================================================================== IS_DIGIT PROC NEAR CMP AL, '0' JB NOT_DIGIT CMP AL, '9' JA NOT_DIGIT CLC ; 是数字,清CF RET NOT_DIGIT: STC ; 非数字,置CF RET IS_DIGIT ENDP ; ================================================================================== ; 子程序6:CHECK_COLON(检查是否为冒号) ; ================================================================================== CHECK_COLON PROC NEAR PUSH AX ; 调用前需用INT 21h AH=01h读取字符到AL CMP AL, ':' JNE COLON_ERR POP AX CLC ; 是冒号,清CF RET COLON_ERR: POP AX STC ; 非冒号,置CF RET CHECK_COLON ENDP ; ================================================================================== ; 子程序7:DISPLAY_CLOCK(显示时间,居中) ; ================================================================================== DISPLAY_CLOCK PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX ; 设置光标到屏幕中间(第12行,第35列) MOV AH, 02H MOV BH, 0 MOV DH, 12 MOV DL, 35 INT 10H ; 显示小时(HH) MOV AL, HOUR CALL BIN_TO_ASCII MOV AH, 02H MOV DL, DH INT 21H ; 显示十位 MOV DL, DL INT 21H ; 显示个位 ; 显示冒号: MOV DL, ':' INT 21H ; 显示分钟(MM) MOV AL, MIN CALL BIN_TO_ASCII MOV DL, DH INT 21H ; 显示十位 MOV DL, DL INT 21H ; 显示个位 ; 显示冒号: MOV DL, ':' INT 21H ; 显示秒(SS) MOV AL, SEC CALL BIN_TO_ASCII MOV DL, DH INT 21H ; 显示十位 MOV DL, DL INT 21H ; 显示个位 POP DX POP CX POP BX POP AX RET DISPLAY_CLOCK ENDP ; ================================================================================== ; 子程序8:BIN_TO_ASCII(二进制转ASCII) ; ================================================================================== BIN_TO_ASCII PROC NEAR PUSH AX PUSH CX MOV AH, 0 MOV CL, 10 DIV CL ; AL=商(十位数值),AH=余数(个位数值) ADD AL, 30H ; 十位数值转ASCII MOV DH, AL ADD AH, 30H ; 个位数值转ASCII MOV DL, AH POP CX POP AX RET BIN_TO_ASCII ENDP ; ================================================================================== ; 子程序9:UPDATE_TIME(更新时间,处理进位) ; ================================================================================== UPDATE_TIME PROC NEAR PUSH AX ; 秒进位 INC SEC MOV AL, SEC CMP AL, 60 JB UPDATE_DONE MOV SEC, 0 ; 分进位 INC MIN MOV AL, MIN CMP AL, 60 JB UPDATE_DONE MOV MIN, 0 ; 时进位 INC HOUR MOV AL, HOUR CMP AL, 24 JB UPDATE_DONE MOV HOUR, 0 UPDATE_DONE: POP AX RET UPDATE_TIME ENDP ; ================================================================================== ; 子程序10:DELAY_1S(延时1秒) ; ================================================================================== DELAY_1S PROC NEAR PUSH CX PUSH DX MOV CX, 0010H DELAY_OUTER: MOV DX, 0FFFFH DELAY_INNER: DEC DX JNZ DELAY_INNER DEC CX JNZ DELAY_OUTER POP DX POP CX RET DELAY_1S ENDP ; ================================================================================== ; 子程序11:CHECK_KEY(检查键盘输入,按任意键退出) ; ================================================================================== CHECK_KEY PROC NEAR PUSH AX MOV AH, 01H INT 16H JNZ EXIT_PROG POP AX RET CHECK_KEY ENDP CODE ENDS END STAR修改代码
10-21
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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值