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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 南京老人去世后怎么办 吸毒强戒两年家人该怎么办 犯人在监狱里病亡怎么办 父母去世监狱人怎么办 公司不续签合同怎么办 股票亏20个点后怎么办 摩托车给扣了怎么办 通知拘留跑了怎么办 假烟倒卖会怎么办 卖了40万假烟怎么办 刑事拘留15天了怎么办 治安传唤人不到怎么办 治安处罚有劣迹怎么办 学生怀孕了该怎么办 有病不能拘留那怎么办 拘留所不交伙食费怎么办 治安拘留不执行怎么办 释放证明书丢了怎么办 银行提前收贷款怎么办 存货周转天数高怎么办 欠款人没有财产怎么办 起诉后对方没钱怎么办 法院起诉人不到怎么办 治安拘留跑了怎么办 看守所里生病了怎么办 二审上诉被驳回怎么办 醉酒驾车取保候审以后怎么办 小案子证据不足怎么办 撞车不严重逃逸怎么办 被执行人没有财产执行怎么办 挖到人头了怎么办 取保保证金不退怎么办 被诬陷经济诈骗怎么办 醉驾刑事拘留后怎么办 被别人举报赌博怎么办 涉黄刑事拘留怎么办取保候审 换了车牌保险怎么办 车辆转让后保险怎么办 立案后警察不管怎么办 打架后对方讹人怎么办 工商被恶意举报怎么办