dosbox masm 汇编语言 三天入门介绍 以及 实现显示时间的功能


这里就不加什么内容了,都写在了程序注释里。刚学汇编三天,如果有写的不对的欢迎评论留言。。。

dosbox以及全部所需资源下载

迅雷云盘
链接:https://pan.xunlei.com/s/VN88xwhr4ThZJvpOUaNu8r36A1
提取码:h3ax

下载链接为一个masm.zip文件 内部包含
DOSBox0.74_3_win32_installer.exe
debug.exe
LINK.EXE
MASM.EXE
ML.EXE
DOSXNT.EXE
exe2bin.exe

其中 h.asm 文件内容为下文纯代码
编译运行方式为
在dosbox窗口界面 运行命令

mount c f:/文件解压路径
c:
masm h #然后敲三下回车
link h #然后敲三下回车
h #直接运行

masm 汇编语言 显示时间 程序及注释

DATAS  SEGMENT
     STRING  DB  'TIME IS ','$' ;设置 string字符串 随便加逗号
     ;例 STRING  DB  'TIME IS ',5,'d',12,'h','$' ;debug中用-d 0000 查看
DATAS  ENDS

CODES  SEGMENT
     ASSUME    CS:CODES,DS:DATAS
     
START:
     NOP;不操作 命令整理
     MOV  AX,DATAS ;将DATAS中的数据移动到AX的地址下 相当于给AX赋值 下文同理
     MOV  DS,AX
     LEA  DX,STRING ;string的地址偏移存入DX
     ;DX=1357 则DH=13 DL=57 用DEBUG name.exe -r 可以查看到DX DS这些32位内存 但是看不到DH DL 
     ;在debug中用-d 0000 可以看到string中的内容

     MOV AH,9 ;设置 AX = 09xx
     INT 21H ; 调用AH中的09H号命令 复制这一条百度会有使用说明

     MOV  AH,2CH
     INT  21H  ;2CH命令 将 时分秒 存入 CH CL DH
     PUSH DX ;将DX放入堆栈中

     MOV AL,CH
     CALL DISPLAY;跳转到下文中的 DISPLAY 函数 用于将小时数转为ASCII码并显示

     MOV AL,CL
     CALL DISPLAY
     
     
     POP AX ;从堆栈中取出一个数到AX中
     PUSH AX
     MOV AL,AH
     CALL DISPLAY

     POP AX
     CALL DISPLAY
               
     MOV  AH,4CH
     INT  21H
DISPLAY:
     PUSH BP ;将BP放入堆栈
     MOV BP,SP ;将命令指针存入BP 
     
     MOV AH,0 ;接下来转为ascii 码 属实看不懂 就直接拿来用了
     MOV BL,10
     DIV BL
     ADD AX,3030H ; AX + 3030并将结果存入AX
     PUSH AX	;将AX放入瓶子里 doge
     MOV DL,AL
     MOV AH,02
     INT 21H
     POP DX		;从瓶口取出并放在DX里 doge
     MOV DL,DH
     INT 21H ;调用 AH中的指令 此时仍为02H
     
     MOV DL,":"
     INT 21H

     MOV SP,BP ;从BP恢复开始时的命令指针
     POP BP	;将BP恢复 之前恢复BP操作没写 直接把DOSBOX卡死了 无法操作 只能关闭窗口
     RET ;不懂 懒得百度了
CODES  ENDS ;结束了
    END   START ;终于结束了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我明白了你的问题。以下是汇编语言的代码,可以实现你的需求: ``` .model small .stack 100h .data prompt1 db 'Enter D to display date, T to display time, or Q to quit: $' prompt2 db 'Invalid input! Enter D to display date, T to display time, or Q to quit: $' datestr db 'Today is $' timestr db 'The time is $' crlf db 0dh, 0ah, '$' .code main proc mov ax, @data mov ds, ax ; display initial prompt mov ah, 9h lea dx, prompt1 int 21h input_loop: ; read user input mov ah, 1h int 21h ; check input cmp al, 'D' je display_date cmp al, 'T' je display_time cmp al, 'Q' je exit_program ; display error message and prompt again mov ah, 9h lea dx, prompt2 int 21h jmp input_loop display_date: ; display "Today is" message mov ah, 9h lea dx, datestr int 21h ; get current date mov ah, 2ah int 21h ; display date mov ah, 2h mov dl, dh ; day add dl, 30h int 21h mov dl, '/' int 21h mov dl, dl ; month add dl, 30h int 21h mov dl, '/' int 21h mov dh, dl ; year (high byte) shr dh, 4 add dh, 30h mov dl, dh ; year (low byte) and dl, 0fh add dl, 30h int 21h ; display newline mov ah, 9h lea dx, crlf int 21h ; prompt again jmp input_loop display_time: ; display "The time is" message mov ah, 9h lea dx, timestr int 21h ; get current time mov ah, 2ch int 21h ; display time mov ah, 2h mov dl, ch ; hour shr dl, 4 add dl, 30h mov dh, ch ; hour and dh, 0fh add dh, 30h int 21h mov dl, ':' int 21h mov dl, cl ; minute shr dl, 4 add dl, 30h mov dh, cl ; minute and dh, 0fh add dh, 30h int 21h mov dl, ':' int 21h mov dl, dh ; second shr dl, 4 add dl, 30h mov dh, dh ; second and dh, 0fh add dh, 30h int 21h ; display newline mov ah, 9h lea dx, crlf int 21h ; prompt again jmp input_loop exit_program: mov ah, 4ch int 21h main endp end main ``` 你可以将代码保存为一个文件,例如 `datetime.asm`,然后使用汇编器将其编译成可执行文件。在 DOSBox 中运行可执行文件即可。 注意,本代码仅适用于 DOS 系统。如果你想在其他系统中运行,需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值