linux的汇编学习(1)---实现打印寄存器的数值,或者打印字符串
来源:互联网 发布:奶酪陷阱同款衣服淘宝 编辑:程序博客网 时间:2024/05/22 01:27
【完整代码已经归档到 https://github.com/linzhanglong/mini_bootloader 】
这里实现了两个函数:
1. 一个是print_hex函数,用于实现把bx寄存器的内容以十六进制的形式显示出来
2. 一个是print_string函数,用于实现把bx寄存器所指向的字符串打印出来
直接看最终的代码实现:
[org 0x7c00];打印字符串mov bx, hello_stringcall print_string;打印数字mov bx, 0x1234call print_hexmov bx, 5555call print_hexjmp $;把实现的两个打印函数的所在文件直接包含进来%include "print.asm"hello_string: db 'Hello', 0times 510-($-$$) db 0dw 0xaa55
对应输出的效果图:
print.asm文件实现的两个打印函数源码:
;该文件提供两个函数:; 一个是print_hex函数,用于实现把bx寄存器的内容以十六进制的形式显示出来; 一个是print_string函数,用于实现把bx寄存器所指向的字符串打印出来;@ brief 先输出0x字符init_print_hex: pusha mov ah, 0x0e mov al, '0' int 0x10 mov al, 'x' int 0x10 popa ret;@ brief 输出完毕之后,加上回车end_print_hex: pusha mov ah, 0x0e ;'\n' mov al, 0x0a int 0x10 mov al, 0x0d int 0x10 popa ret;@ brief 把一个大小是0-15数字转为一位十六进制输出;@ param bl保存要打印的数字[大小是0-15]convert_one_hex: pusha mov ah, 0x0e ;如果数字大于15,异常。打印?号 cmp bl, 15 jg _ERROR ;如果数字大于10,那么转为A-F cmp bl, 10 jge _LETTER ;如果数字是0-10,就只加上'0',就可以把0-10转为对应数字的ascii码 add bl, '0' mov al, bl jmp _EXIT_LETTER: ;先把数字减去10,然后加上A,就可以把10-15的数字转为A-F sub bl, 10 add bl, 'A' mov al, bl jmp _EXIT_ERROR: mov al, '?'_EXIT: int 0x10 popa ret;@ brief 把一个数字转为多位十六进制输出;@ param bx保存要打印的数字print_hex: pusha call init_print_hex ;首先通过掩码和移位的方式,把数字以十六进制的方式从最后一位开始一个个压入堆栈 ;然后输出时候才从堆栈里一个个取出来,这样就可以实现顺序打印 xor cx, cx_NEED_PUSH: ;取掩码获取数字以十六进制形式的最后一位,例如数字0x1234取出4,其中4保存到al,0x123保存到bx。cl计数 mov ax, bx and ax, 0x0f shr bx, 4 ;入栈并且计数 push ax inc cl ;如果bx数值为0,表示我们已经全部处理完 cmp bx, 0 jne _NEED_PUSH ;开始出栈,并且显示_NEED_POP: pop bx call convert_one_hex dec cl cmp cl, 0 jne _NEED_POP call end_print_hex popa ret ;@ brief 打印字符串;@ param bx要打印字符串的地址,字符串以0结尾print_string: pusha mov ah, 0x0e_NEXT_CHAR: mov al, [bx] cmp al ,0 ;如果是0,表示字符串结尾了 je _END ;显示一个字符 int 0x10 inc bx jmp _NEXT_CHAR _END: ;回车 mov al, 0x0a int 0x10 mov al, 0x0d int 0x10 popa ret
阅读全文
0 0
- linux的汇编学习(1)---实现打印寄存器的数值,或者打印字符串
- start.s里面打印一个寄存器的值的汇编实现
- 深入理解计算机系统-之-数值存储(二)--C程序打印变量的每一字节或者位
- 指定打印的字符串
- python 打印数值的二进制形式
- 三个Java多线程循环打印递增的数字,每个线程打印5个数值,打印周期1-75
- 大型机汇编(HLASM)之随时显示所有寄存器里的数值
- 实现DataGridView的打印
- 打印预览的实现
- 打印功能的实现
- 打印功能的实现
- 打印功能的实现
- Linux打印的介绍
- ARM架构kprobe应用及实现分析(5.0 打印寄存器的值)
- 打印字符串的全排列
- gdb 打印字符串的全部内容
- 打印字符串的任意一部分
- gdb 打印字符串的全部内容
- cocoapods pod install 报错
- 什么是分布式系统中的幂等性
- linux 部署svn服务器
- 嵌入式系统C语言重点语法(1)——const、volatile、static、堆栈等的意义及用法
- weblogic 监控重启脚本
- linux的汇编学习(1)---实现打印寄存器的数值,或者打印字符串
- Android的设计模式-迭代器模式
- Disconf介绍,源码下载,环境准备,安装,disconf-web使用和配置介绍,项目中进行配置,项目案例运行
- Microservices From Design to Deployment(中文完整版)目录
- 【笔记】哈希表
- using matlab to simplify calculation
- 关于VBOXGuestAddtion安装失败
- Microservices From Design to Deployment(中文完整版)下载地址
- 组合游戏