汇编大作业(清屏和显示特定字符和拷贝自己)汇编学习记录

时间:2022-06-14 11:55:21

收集到一下的必须资料
- 显示缓冲区80*25
- 一个字符占用两个字节,分别放ASCII码和属性

assume cs:code
code segment
start:
    mov ax,0b800h
    mov ds,ax   
    mov cx,7d0h         ; 外循环设置为25*80,输出3次
    mov si,0h           
s0: mov byte ptr [si],20h
    add si,1
    mov byte ptr [si],0f8h
    add si,1
    loop s0
    mov ax,4c00h
    int 21h
code ends
end start

另一道题是显示特定字符的。

assume cs:code
code segment
start:
    mov ax,0b800h       
    mov ds,ax           ;
    mov cx,3h           ; 外循环设置为3次
    mov si,0h 
    mov bx,906h         ;14*80+35=0x483 偏移
s0: push cx
    mov cx,10d
    mov si,0d
s1: mov byte ptr [bx+si],31h ; 字符'1'
    add si,1d
    mov byte ptr [bx+si],07h
    add si,1d
    loop s1
    add bx,160d         ;转移至下一行
    pop cx
    loop s0
    mov ax,4c00h
    int 21h
code ends
end start

汇编大作业(清屏和显示特定字符和拷贝自己)汇编学习记录

拷贝自己

前置知识
  • 程序加载的时候ip的初始值都为0,这样我们就可以直接用CS加偏移拷贝程序自己了
  • 还有一段安全的空间,00200-00fff

    assume cs:code
    code segment
    mov dx,cs   
    mov es,dx
    mov bx,0020h   ;长度为3
    mov ds,bx
    mov cx,19h     ;长度为3
    mov bx,0h       ;长度为3
    s:  mov ax,es:[bx]  ;长度为3
    mov [bx],ax
    add bx,1h      ;长度为3
    loop s
    code ends
    end
    

    汇编大作业(清屏和显示特定字符和拷贝自己)汇编学习记录