《Linux就该这么学》_Day2_ch01、ch02

本文围绕《Linux就该这么学》第二天内容展开。介绍了部署虚拟环境安装RHEL7系统的步骤,包括工具下载、虚拟机安装及系统安装注意事项。还讲解了RPM与Yum软件仓库,RHEL7管理服务的命令,以及常用Linux命令,如man、echo、date等。

《Linux就该这么学》_Day2_ch01、ch02

2019.05.04

ch01.部署虚拟环境安装linux系统

安装虚拟机以及RHEL7系统
工具下载地址:点击这里
页面验证码:585141
需要下载的工具:
VM虚拟机12版本、RHEL7系统镜像;
1.VM虚拟机的密钥百度随便找都有啦。。。
2.在虚拟机里安装RHEL7系统要注意:
1)切记选择“稍后安装操作系统”;
2)自定义硬件:
内存分配:最少不低于1GB,最多不超过2GB,多了浪费,少了跑起来卡;
处理器核心数分配:跟实际物理cpu的核心数一样即可,因为就算企图分配比实际物理cpu核心数多的数量,也会提示失败;
光驱设备:要在“使用ISO镜像文件”中选中下载好的RHEL7系统镜像文件;
网络适配器:仅主机模式
其余设备:USB控制器、声卡、打印机都可以移除;
3)系统语言建议选用英文English(US),网卡不用配;
通过上述步骤,即可得到最初的RHEL7实验环境了。

RPM(红帽软件包管理器)与Yum软件仓库
RPM:通过将安装规则与源代码打包在一起,降低软件安装难度;
Yum软件仓库:通过将大量的常用RPM软件包存放在一起,解决软件包之间的依赖关系,进一步降低软件安装难度。
RPM(红帽软件包管理器)与Yum软件仓库
RHEL7必须记住的管理服务的命令
| 启动服务 | systemctl start 服务名称
| 重启服务 | systemctl restart 服务名称
| 停止服务 | systemctl stop 服务名称
| 服务加入开机启动项 | systemctl enabled 服务名称
| 查看服务状态 | systemctl status 服务名称
管理服务命令

ch02.必须掌握的Linux命令

2.1 Shell(终端或壳)的作用:人是不能直接与系统内核进行交流的,而shell则充当了人与内核之间的翻译官。
主流Linux系统选用的终端为Bash。

2.2 man查看帮助命令
ex:man ls #查看ls命令的帮助
man查看帮助命令
2.3 常用系统工作命令
1.echo命令:用于在终端输出字符串或变量提取后的值

echo hello world    #输出字符串hello world
echo $SHELL         #输出变量SHELL的值

2.date命令:用于显示及设置系统的时间或日期。

date "+%Y-%m-%d %H:%M:%S"                #按 年-月-日 时:分:秒 格式输出日期时间
date -s "20190504 23:00:00"              #将系统当前时间设置为2019年5月4日23时0分0秒,加-s参数即可设置系统当前时间

3.reboot命令:重启系统。该操作涉及硬件资源的管理权限,默认只有root管理员有权限执行。
4.poweroff命令:关机。该操作涉及硬件资源的管理权限,默认只有root管理员有权限执行。
5.wget命令:在终端中下载网络文件。

wget https://www.linuxprobe.com/docs/LinuxProbe.pdf              #下载linuxprobe.pdf文件
wget -r -p https://www.linuxprobe.com                            #递归下载www.linuxprobe.com网站内的所有页面数据以及文件

6.ps命令:用于查看系统中的进程状态
参数 作用
-a 显示所有进程(包括其他用户的进程)
-u 用户以及其他详细信息
-x 显示没有控制终端的进程

ps aux            #查看系统中所有进程的状态,包括没有控制终端的进程,用户以及其他详细信息这个命令比较特殊,使用参数可以不加"-"号

进程状态说明:
R(运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
T(停止):进程收到停止信号后停止运行。

7.top命令:用于动态地监视进程活动与系统负载等信息。
top命令
8.pidof命令:用于查询某个指定服务进程的进程号码(PID)值。每个进程的PID值是唯一的。

pidof sshd            #查看sshd服务的PID值

9.kill命令:用于终止某个指定PID的服务进程。

kill 2156               #配合pidof命令使用,先用pidof找出某个服务进程的PID,然后kill PID来终止该服务进程。

10.killall命令:用于终止某个指定名称的服务的所有进程。

killall httpd          #结束httpd服务的全部进程
我将给出的程序进行部分修改,成功显示了我需要的概念,但是在输出格式上有点小问题,假设现在是2025年6月26日星期四下午4点51分18秒,百分秒为88。使用我修改后的程序输出格式为:日期和时间是两行输出,我现在需要把它们放在一行显示,日期放在时间后面,中间隔一个逗号,且删除月份和日期中间的逗号,用空格代替。例如,输出为: Thursday,June,26,2025 04:51:18.88 P.M. 而我需要的输出格式为: 04:51:18.88 P.M.,Thursday,June 26,2025 请修改代码 代码如下所示: .MODEL SMALL .STACK 100H .DATA ; 时间显示相关 am_str DB 'A.M.$' pm_str DB 'P.M.$' colon DB ':$' dot DB '.$' space DB ' $' comma DB ', $' newline DB 0DH, 0AH, '$' ; 回车换行 ; 星期名称指针表 weekday_ptrs DW SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY SUNDAY DB 'Sunday$' MONDAY DB 'Monday$' TUESDAY DB 'Tuesday$' WEDNESDAY DB 'Wednesday$' THURSDAY DB 'Thursday$' FRIDAY DB 'Friday$' SATURDAY DB 'Saturday$' ; 月份名称指针表(修复:补齐12个月份) month_ptrs DW JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE DW JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER JANUARY DB 'January$' FEBRUARY DB 'February$' MARCH DB 'March$' APRIL DB 'April$' MAY DB 'May$' JUNE DB 'June$' JULY DB 'July$' AUGUST DB 'August$' SEPTEMBER DB 'September$' OCTOBER DB 'October$' NOVEMBER DB 'November$' DECEMBER DB 'December$' ; 时间日期缓存 hour_12 DB ? am_pm DB ? ; 0=A.M., 1=P.M. ; 日期临时变量(修复非法内存访问) current_weekday DB ? current_day DB ? current_month DB ? current_year DW ? .CODE START: MOV AX, @DATA MOV DS, AX ; 设置文本模式 - 修复内存访问冲突 MOV AX, 0003H INT 10H MAIN_LOOP: ; 设置光标到(0,0) XOR DX, DX CALL SET_CURSOR ; 显示日期 CALL SHOW_DATE ; 设置光标到(1,0) MOV DH, 1 XOR DL, DL CALL SET_CURSOR ; 显示时间 CALL SHOW_TIME ; 检查按键 (修复:使用正确的方法检查按键) MOV AH, 01H INT 16H JNZ EXIT_PROGRAM ; 有按键则退出 ; 短暂延时(约55ms) - 修复百分秒不更新问题 MOV CX, 5 ; 减少延迟时间 MOV DX, 86A0H MOV AH, 86H INT 15H JMP MAIN_LOOP EXIT_PROGRAM: ; 清空键盘缓冲区 MOV AH, 0CH MOV AL, 0 INT 21H ; 设置光标位置 (DH=行, DL=列) SET_CURSOR PROC MOV AH, 02H MOV BH, 0 ; 页号0 INT 10H RET SET_CURSOR ENDP ; 显示日期子程序 - 完全重构 SHOW_DATE PROC ; 获取日期 (INT 21H, AH=2AH) MOV AH, 2AH INT 21H ; 返回: AL=星期几(0=日), CX=年, DH=月, DL=日 ; 保存日期值到内存变量 (修复非法内存访问) MOV current_weekday, AL MOV current_day, DL MOV current_month, DH MOV current_year, CX ; 显示星期 (修复索引计算错误) XOR AX, AX MOV AL, current_weekday ; 星期索引(0-6) MOV SI, AX SHL SI, 1 ; 乘以2 (指针大小) MOV DX, weekday_ptrs[SI] MOV AH, 09H INT 21H ; 显示逗号 MOV DX, OFFSET comma INT 21H ; 显示月份 (修复月份索引错误) XOR AX, AX MOV AL, current_month ; 月份(1-12) DEC AL ; 调整为0-based索引 MOV SI, AX SHL SI, 1 ; 乘以2 (指针大小) MOV DX, month_ptrs[SI] MOV AH, 09H INT 21H ; 显示空格 MOV DX, OFFSET space INT 21H ; 显示日 (修复日期值处理错误) XOR AX, AX MOV AL, current_day CALL PRINT_DECIMAL ; 显示逗号 MOV DX, OFFSET comma MOV AH, 09H INT 21H ; 显示年 MOV AX, current_year CALL PRINT_DECIMAL RET SHOW_DATE ENDP ; 显示时间子程序 - 修复百分秒显示问题 SHOW_TIME PROC ; 获取时间 (INT 21H, AH=2CH) MOV AH, 2CH INT 21H ; 返回: CH=时, CL=分, DH=秒, DL=百分秒 ; 保存时间值 (修复百分秒处理) PUSH DX ; 保存秒/百分秒 PUSH CX ; 保存时/分 ; 转换为12小时制 MOV AL, CH ; 小时 CMP AL, 0 JE HOUR_12_AM CMP AL, 12 JB HOUR_AM JE HOUR_12_PM SUB AL, 12 MOV [am_pm], 1 JMP HOUR_DONE HOUR_12_AM: MOV AL, 12 MOV [am_pm], 0 JMP HOUR_DONE HOUR_AM: MOV [am_pm], 0 JMP HOUR_DONE HOUR_12_PM: MOV AL, 12 MOV [am_pm], 1 HOUR_DONE: MOV [hour_12], AL ; 显示小时 MOV AL, [hour_12] CALL PRINT_TWO_DIGITS ; 显示冒号 MOV DX, OFFSET colon MOV AH, 09H INT 21H ; 显示分钟 POP CX ; 恢复时/分 MOV AL, CL CALL PRINT_TWO_DIGITS ; 显示冒号 MOV DX, OFFSET colon MOV AH, 09H INT 21H ; 显示秒 (修复百分秒处理) POP DX ; 恢复秒/百分秒 PUSH DX ; 重新保存百分秒 MOV AL, DH ; 秒 CALL PRINT_TWO_DIGITS ; 显示点 MOV DX, OFFSET dot MOV AH, 09H INT 21H ; 显示百分秒 (修复:直接从原始值获取) POP DX ; 恢复百分秒 MOV AL, DL ; 百分秒 CALL PRINT_TWO_DIGITS ; 显示空格 MOV DX, OFFSET space MOV AH, 09H INT 21H ; 显示A.M./P.M. MOV DX, OFFSET am_str CMP [am_pm], 1 JNE SHOW_AMPM MOV DX, OFFSET pm_str SHOW_AMPM: MOV AH, 09H INT 21H RET SHOW_TIME ENDP ; 打印两位数(AL=0-99) - 修复寄存器冲突 PRINT_TWO_DIGITS PROC PUSH AX ; 保存原始值 AAM ; AH=十位, AL=个位 ADD AX, 3030H MOV BX, AX ; 保存转换结果 MOV DL, BH ; 显示十位 MOV AH, 02H INT 21H MOV DL, BL ; 显示个位 INT 21H POP AX RET PRINT_TWO_DIGITS ENDP ; 打印十进制数(AX=0-65535) - 修复寄存器冲突 PRINT_DECIMAL PROC PUSH BX PUSH CX PUSH DX PUSH SI MOV SI, 10 ; 除数 XOR CX, CX ; 计数器(数字个数) DECIMAL_LOOP: XOR DX, DX DIV SI ; AX / 10 -> AX=商, DX=余数 ADD DL, '0' ; 转为ASCII PUSH DX ; 保存数字 INC CX TEST AX, AX JNZ DECIMAL_LOOP PRINT_LOOP: POP DX ; 取出数字 MOV AH, 02H INT 21H LOOP PRINT_LOOP POP SI POP DX POP CX POP BX RET PRINT_DECIMAL ENDP END START
06-27
<think>我们正在处理一个关于汇编语言编程的问题,用户希望修改日期和时间的输出格式,将它们合并为一行显示,并调整分隔符。根据引用[3],我们知道汇编语言可以直接控制硬件,包括访问系统时钟和进行输出。在汇编中,输出日期和时间通常需要调用系统中断(如DOS的INT21h)来获取系统日期和时间,然后再将其格式化为字符串输出。步骤:1.获取系统日期和时间:使用相应的中断功能。2.将获取的日期和时间数据转换为可显示的字符。3.合并日期和时间字符串,并按照指定的格式排列(例如,使用特定的分隔符)。4.将合并后的字符串输出。在DOS环境下,我们可以使用以下功能:-获取日期:INT21h,AH=2Ah返回:CX=年(1980-2099),DH=月(1-12),DL=日(1-31),AL=星期(0=星期日,1=星期一...)-获取时间:INT21h,AH=2Ch返回:CH=小时(0-23),CL=分钟(0-59),DH=秒(0-59),DL=百分秒(0-99)然后,我们需要将这些数字转换为ASCII字符串,并组合成一个字符串。假设我们想要的格式为:YYYY-MM-DDHH:MM:SS(例如:2023-10-0515:30:45)具体步骤:1.分别获取日期和时间。2.将年、月、日、时、分、秒分别转换为两个字符的字符串(例如,数字10转换为'10')。3.将这些字符串按照格式要求连接起来,中间用指定的分隔符(如破折号和冒号)连接。4.输出这个字符串。注意:转换数字为字符串时,需要将二进制数转换为十进制,然后分解为十位和个位,再转换为ASCII码(加30h)。下面是一个示例程序框架(假设使用8086汇编,在DOS下运行):```assembly.modelsmall.stack100h.datadateTimeStrdb'YYYY-MM-DDHH:MM:SS',0Dh,0Ah,'$';预留位置,0Dh,0Ah是回车换行,'$'是DOS字符串结束符;定义各部分的位置,方便直接替换;索引:0-3:年,4:分隔符'-',5-6:月,7:分隔符'-',8-9:日,10:空格,11-12:小时,13:分隔符':',14-15:分钟,16:':',17-18:秒.codemainprocmovax,@datamovds,ax;获取日期movah,2Ahint21h;返回:CX=年,DH=月,DL=日;将年(CX)转换为4位字符串,存入dateTimeStr[0]到dateTimeStr[3]movax,cxcallword_to_dec_str;将AX中的字(word)转换为4位十进制字符串,结果放在di指向的位置;这里我们假设di指向dateTimeStr[0],然后我们分别处理4位数字;实际上,我们可以分别处理年、月、日、时、分、秒,并逐个替换到字符串模板中;转换月份(DH)moval,dhcallbyte_to_dec_str;将AL中的字节转换为两位十进制字符串,结果放在ax中(ah=十位,al=个位);将转换后的月份存入字符串位置[5]和[6]mov[dateTimeStr+5],ahmov[dateTimeStr+6],al;转换日(DL)moval,dlcallbyte_to_dec_strmov[dateTimeStr+8],ahmov[dateTimeStr+9],al;获取时间movah,2Chint21h;返回:CH=小时,CL=分钟,DH=秒;转换小时(CH)moval,chcallbyte_to_dec_strmov[dateTimeStr+11],ahmov[dateTimeStr+12],al;转换分钟(CL)moval,clcallbyte_to_dec_strmov[dateTimeStr+14],ahmov[dateTimeStr+15],al;转换秒(DH)moval,dhcallbyte_to_dec_strmov[dateTimeStr+17],ahmov[dateTimeStr+18],al;现在,我们的字符串已经构建完成,输出movdx,offsetdateTimeStrmovah,09hint21h;退出程序movax,4C00hint21hmainendp;将字节(0-99)转换为两个字符的十进制字符串(十位和个位);输入:AL=字节;输出:AH=十位数的ASCII,AL=个位数的ASCIIbyte_to_dec_strprocpushcxxorah,ah;清除ah,现在ax=almovcl,10divcl;al=ax/10,ah=余数addal,30h;十位转换为字符addah,30h;个位转换为字符popcxretbyte_to_dec_strendp;将字(word,0-65535)转换为4位十进制字符串;输入:AX=字;输出:在di指向的位置连续存放4个字符word_to_dec_strprocpushaxpushbxpushcxpushdxpushdimovbx,1000xordx,dxdivbx;ax=商(千位),dx=余数addal,30hmov[di],alincdimovax,dx;余数在dx中,现在放入axmovbx,100xordx,dxdivbx;ax=百位,dx=余数addal,30hmov[di],alincdimovax,dxmovbl,10divbl;al=十位,ah=个位addal,30haddah,30hmov[di],alincdimov[di],ahincdipopdipopdxpopcxpopbxpopaxretword_to_dec_strendpendmain```注意:上面的代码中,我们预先定义了一个模板字符串`dateTimeStr`,其中包含了固定的分隔符(如'-'、空格和':')和预留的数字位置。然后,我们分别获取日期和时间,并将每个部分转换为两位数字(年转换为四位)并替换到模板的相应位置。用户可以根据需要调整分隔符,只需修改模板字符串中的分隔符位置即可。例如,如果用户想要将日期格式改为用斜杠分隔,时间用点分隔,并且不显示秒,那么可以修改模板字符串为:`db'YYYY/MM/DDHH.MM',0Dh,0Ah,'$'`然后相应地调整转换后数字的存放位置(比如秒的部分就不需要了)。注意:上面的代码是示例性的,可能需要根据实际汇编环境(如使用的汇编器)进行适当调整。另外,由于年份是4位数,我们使用了一个子程序`word_to_dec_str`来转换。而月、日、时、分、秒都是两位数,使用`byte_to_dec_str`转换。关于输出,我们使用DOS的09h功能(显示字符串)输出整个字符串。用户可以根据自己的需求修改模板字符串和替换位置。相关问题:1.如何在汇编语言中获取系统日期和时间?2.如何将二进制数转换为十进制字符串?3.如何在汇编语言中输出字符串?4.如何调整汇编程序中的输出格式(如日期时间格式)?5.在DOS汇编程序中,常用的中断调用有哪些?</think>### 修改汇编语言中的日期时间输出格式 在汇编语言中修改日期时间输出格式需要以下步骤,以 DOS 环境为例(使用 INT 21h 系统调用): #### 1. **获取系统日期和时间** ```assembly ; 获取日期 (INT 21h/AH=2Ah) mov ah, 2Ah int 21h ; 返回: CX=年, DH=月, DL=日 ; 获取时间 (INT 21h/AH=2Ch) mov ah, 2Ch int 21h ; 返回: CH=时, CL=分, DH=秒 ``` #### 2. **将数值转换为 ASCII 字符** 需要将二进制值转换为两位十进制字符串: ```assembly ; 示例:转换 AL 中的值为两位 ASCII byte_to_ascii proc mov ah, 0 mov bl, 10 div bl ; AL=商(十位), AH=余数(个位) add ax, 3030h ; 转换为 ASCII ret byte_to_ascii endp ``` #### 3. **合并日期时间并调整格式** 构建单行输出缓冲区,按需添加分隔符: ```assembly data_segment: datetime db 'YYYY-MM-DD HH:MM:SS', '$' ; 输出模板 ; 填充模板示例: mov [datetime], '2' ; 固定前缀(20xx年) mov [datetime+1], '0' call fill_year ; 填充年份后两位 mov [datetime+4], '-' ; 日期分隔符 call fill_month mov [datetime+7], '-' ; 日期分隔符 call fill_day mov [datetime+10], ' ' ; 日期时间分隔符 call fill_hour mov [datetime+13], ':' ; 时间分隔符 call fill_minute mov [datetime+16], ':' ; 时间分隔符 call fill_second ``` #### 4. **输出合并后的字符串** 使用 DOS 字符串输出功能: ```assembly mov dx, offset datetime mov ah, 09h int 21h ``` #### 关键修改点 1. **分隔符调整** 修改模板中的 `-`、` `、`:` 符号即可自定义格式,例如: - `2023/10/05 15-30-45` → 替换为 `[datetime+4] '/'` 等 2. **单行显示** 取消日期和时间输出间的换行符(原输出通常包含 `0Dh, 0Ah`),替换为空格或其他连接符[^1]。 3. **对齐处理** 确保单位数日期/时间补零(如 `05` 而非 `5`),通过转换函数自动处理。 ### 完整流程示例 ```assembly org 100h mov ax, @data mov ds, ax ; 获取并填充日期时间 call get_datetime ; 输出单行格式 mov dx, offset datetime mov ah, 09h int 21h mov ax, 4C00h int 21h get_datetime proc ; 获取日期 (略) ; 获取时间 (略) ; 转换并填充到 datetime 缓冲区 ret get_datetime endp .data datetime db '0000-00-00 00:00:00$' ; 可修改分隔符 ``` ### 注意事项 1. **显存直接写入** 若需在图形界面显示,需直接写入显存地址 `B800h`,每个字符占 2 字节(ASCII+属性)[^2]。 2. **跨平台差异** Windows/Linux 汇编需使用其他系统调用(如 Linux INT 80h)。 3. **实时更新** 循环调用可实现动态时钟,但需控制刷新频率。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值