汇编语言使用转义字符实现简单的“全屏”文本输出

这是一个运行在Linux下的、简单的汇编程序,使用NASM 2.11,展示了使用转义字符实现简单的“全屏”文本输出

; 可执行文件名    : eatterm
; 版本        : 1.0
; 创建日期    : 7/10/2016
; 最后更新日期    : 7/10/2016
; 作者        : Moonlight Poet
; 描述        : 一个运行在Linux下的、简单的汇编程序,使用NASM 2.11,
;     展示了使用转义字符实现简单的“全屏”文本输出
;
; 使用以下命令生成:
;     nams -f elf -g -F stabs eatterm.asm
;     ld -o eatterm eatterm.o
;
SECTION .data            ; 包含已初始化的数据
SCRWIDTH: equ 80        ; 默认情况下我们假设80个字符宽
PosTerm: db 27,"[01;01H"    ; <ESC>[<Y>;<X>H
POSLEN: equ $-PosTerm        ; 术语位置字符串的长度
ClearTerm: db 27,"[2J"        ; <ESC>[2J
CLEARLEN: equ $-ClearTerm    ; 属于清除字符串的长度
AdMsg: db "Eat at Joe‘s!"    ; 广告消息
ADLEN: equ $-AdMsg        ; 广告消息的长度
Prompt: db "Press Enter: "    ; 用户提示信息
PROMPTLEN: equ $-Prompt        ; 用户提示信息的长度

; 此表为我们提供了0到80之间的数字的以两位表示的ASCII位元(digit)。
; 我们不是通过计算来产生插入终端控制字符串中的ASCII数字,
; 而是在表中查找它们,一次取出两个ASCII位元到一个16位寄存器中,例如DX,
; 然后将该寄存器的值防盗终端控制字符串PosTerm的适当位置。参见GoToXY。
; 如果打算在更大的、超过80x80的控制台上工作,
; 必须在Digits中添加额外的ASCII位元编码。
; 注意:此处显示的代码只能工作在最大99*99的控制台上。
Digits: db "0001020304050607080910111213141516171819"
    db "2021222324252627282930313233343536373839"
    db "4041424344454647484950515253545556575859"
    db "6061626364656667686970717273747576777879"

SECTION .bss            ; 包含未初始化的数据

SECTION .text            ; 包含代码的段

;----------------------------------------------------------------------------------------------------
; ClrScr:    清空Linux控制台
; 最后更新日期:    7/10/2016
; 输入参数:    无
; 返回值:    无
; 修改:        无
; 调用:        内核sys_write
; 描述:        发送预定以的控制字符串<ESC>[2J到控制台,它将清空整个显示器
ClrScr:
    push rax        ; 保存有关寄存器
    push rbx
    push rcx
    push rdx
    mov ecx,ClearTerm    ; 传递终端控制字符串的偏移地址
    mov edx,CLEARLEN    ; 传递终端控制字符串的长度
    call WriteStr        ; 发送终端控制字符串到控制台
    pop rdx            ; 恢复有关寄存器
    pop rcx
    pop rbx
    pop rax
    ret

;----------------------------------------------------------------------------------------------------
; GotoXY:    将Linux控制光标定位到(X,Y)坐标处
; 最后更新日期:    7/10/2016
; 输入参数:    X 存放到 AH,Y 存放到 AL
; 返回值:    没有
; 修改:        PosTerm终端控制序列字符串
; 调用:        内核sys_write
; 描述:        为传递到AL和AH的X,Y坐标准备一个终端控制字符串
;         并且调用sys_write将控制台光标定位到(X,Y)位置
;         在调用GotoXY之后,写文本到控制台将从(X,Y)位置开始显示文本。
GotoXY:
    push rbx    ; 保存主调程序的寄存器
    push rcx
    push rdx
    xor ebx,ebx    ; 清零EBX
    xor ecx,ecx    ; ECX寄存器操作同上
; 插入Y的数字
    mov bl,al            ; 将Y的值放到缩放术语EBX寄存器中
    mov cx,word [Digits+ebx*2]    ; 取出十进制数字放到CX寄存器中
    mov word [PosTerm+2],cx        ; 将数字插入到控制字符串中
; 插入X的数字
    mov bl,ah            ; 将X的值放到缩放术语EBX寄存器中
    mov cx,word [Digits+ebx*2]    ; 取出十进制数字放到CX寄存器中
    mov word [PosTerm+5],cx        ; 将数字插入控制字符串中
; 发送控制序列到标准输出
    mov ecx,PosTerm            ; 传递控制字符串的地址
    mov edx,POSLEN            ; 传递控制字符串的长度
    call WriteStr            ; 发送控制字符串到控制台
; 扫尾,返回:
    pop rdx
    pop rcx
    pop rax
    ret

;----------------------------------------------------------------------------------------------------
; WriteCtr: 发送一个字符串到一个80个字符串宽的Linux控制台的中央位置
; 最后更新日期:    7/10/2016
; 输入参数: 传递Y值到AL中,字符串地址到ECX中,字符串长度到EDX中
; 返回值: 无
; 修改: PosTerm终端控制序列字符串
; 调用: GotoXY, WriteStr
; 描述: 在一个80列宽的Linux控制台显示区域中央显示一个字符串
;     为传入的字符串的长度计算X,
;     然后调用GotoXY和WriteStr将该字符串发送到控制台

WriteCtr:
    push rbx
    xor ebx,ebx
    mov bl,SCRWIDTH
    sub bl,dl
    shr bl,1
    mov ah,bl
    call GotoXY
    call WriteStr
    pop rbx
    ret
;----------------------------------------------------------------------------------------------------
; WriteStr: 发送一个字符串到Linux控制台
; 最后更新日期: 7/10/2016
; 输入参数: 传递字符串地址到ECX中,字符串长度到EDX中
; 返回值: 无
; 修改: 无
; 调用: 内核sys_write
; 描述: 通过一个sys_write内核调用显示一个字符串到Linux控制台
;

WriteStr:
    push rax    ; 保存相关的寄存器
    push rbx
    mov eax,4    ; 指定sys_write调用
    mov ebx,1    ; 指定文件描述符1:标准输出
    int 80h        ; 进行内核调用
    pop rbx        ; 恢复相关的寄存器
    pop rax
    ret        ; 返回

    global _start        ; 连接器需要这个来找到入口点

_start:
    nop        ; 这个无操作指令让gdb感到非常高兴

; 首先我们清空终端显示器
    call ClrScr

    mov al,12
    mov ecx,AdMsg
    mov edx,ADLEN
    call WriteCtr

    mov ax,0117h
    call GotoXY

    mov ecx,Prompt
    mov edx,PROMPTLEN
    call WriteStr

    mov eax,3
    mov ebx,0
    int 80h

Exit:    mov eax,1
    mov ebx,0
    int 80h

效果:

时间: 2024-08-29 10:47:53

汇编语言使用转义字符实现简单的“全屏”文本输出的相关文章

一个简单的全屏图片上下打开显示网页效果

打包下载地址:http://download.csdn.net/detail/sweetsuzyhyf/7602105 上源码看效果: <!DOCTYPE html> <html> <head> <title></title> <style> body { margin: 0; padding: 0; } .wrap { overflow: hidden; position: fixed; z-index: 99999; width:

Linux 命令 - watch: 反复执行命令,全屏显示输出

watch 命令周期性地执行命令,全屏显示输出.可以通过 watch 命令反复执行某一程序来监视它的输出变化. 命令格式 watch [-dhvt] [-n <seconds>] [--differences[=cumulative]] [--help] [--interval=<seconds>] [--no-title] [--version] <command> 命令参数 -n, --interval 指定间隔时间.默认情况下,watch 每隔 2 秒执行一次命令

制作一个超简单的全屏插件(基于JQuery)

一. 首先,定义插件名称,按照JQuery插件命名规范,命名为 jquery.fullscreen.js 代码如下: /**  * Created by Ivan on 2015/1/28.  * jquery.fullscreen.js  */ (function($){     $.fn.toggleFullScreen = function(){         var supportsFullScreen = false;         var fullScreenEventName 

全屏文本编辑器:vim

Vi  visual  interface  bill joy,S.U.N  sparc  sunos(solaris)   Vim:vi improved     模式化编辑器:             编辑模式(命令模式):---->默认的工作模式             末行模式:---->        输入模式(插入模式):---->        替换模式:---->        可视化模式:---->   ①  Vi / vim的打开方式:         1

全屏文本编译器vim

vi/vim打开方式,直接打开界面 vim的关闭方式:q:直接关闭不保存 :q!强制关闭但不保存:w保存修改内容:wq保存并退出 在vim变异模式,移动光标kjhl:上下左右 行内跳转0行首%行尾^相对行首 行间跳转数字加g直接光标移动至低n行 :$最后一行 翻页;ctrl+f网上那个饭一页 x逐字删除X删左侧单个字符 d:删除光标经过的所有内容 dd:删除光标所在行 p:向右向下进行粘贴 yy复制光标所在行 从航模到编辑 esc键,enter,backspace 从输入到输出esc键 替换命令

HTML5 全屏化操作功能

由于项目中用到了全屏化挫折功能,查看了API后写了一个简单的全屏化model <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> .div1{ width: 1000px;height: 500px; border: solid 1px blue;

虚拟桌面启动后自动全屏

如果客户端有多个显示器,打开虚拟桌面后,如果需要进入到全屏模式(覆盖所有的客户端显示器),目前还是需要一定技巧的,需要把桌面拖放到两个屏幕的中间,然后全屏才可以实现.否则,简单的全屏只会覆盖当前所在的屏幕.这对普通用户来说,使用有一定的要求,所以,我们可以通过简单的调整,让虚拟桌面在启动后,自动进入到全屏状态,免去了手动全屏的操作. 我们可以通过以下几种方式来实现: 修改ICA文件:针对所有用户生效修改客户端注册表全局设置:对使用客户端用户的所有桌面生效修改特定桌面组的注册表设置:只对特定桌面组

一种简单实用的全屏方法

实现程序全屏幕显示的思路有很多种,最常见的一种就是: 1)利用Windows API提供的一个结构体WINDOWPLACEMENT来存储全屏显示前视图和主框架窗口在屏幕上的位置和显示信息.非客户区窗口的显隐信息,以便全屏幕显示时恢复窗口原状: 2)通过API函数GetDesktopWindow()得到桌面窗口,由GetWindowRect()得到显示器的尺寸: 3)通过AdjustWindowRect()来计算当客户区大小为屏幕大小时相应的窗口大小: 4)通过SetWindowPlacement

移动端全屏滑动的小插件,简单,轻便,好用,只有3k swiper,myswiper,page,stage

https://github.com/donglegend/mySwiper mySwiper 移动端全屏滑动的小插件,简单,轻便,好用,只有3k 下载 直接下载 bower install mySwiper 预览 预览demo 使用 支持amd和cmd规范 直接引入 <link rel="stylesheet" type="text/css" href="dist/swiper.css"> <script type="