汇编-----打印中断码、call&&ret指令
2018-05-04 本文已影响0人
那时J花开
mov ah, 9h int 21h 打印中断
21h中断中的9h中断码代表打印, CPU拿到需要打印的数据, 将其放到显示内存(显存)上,完成打印操作
assume cs:code, ds:data, ss:stack
stack segment
db 20 dup(1) ; 定义20个字节作为栈段
stack ends
data segment
db 20 dup(2)
str db 'hello world!$'
data ends
code segment
start:
mov dx, offset str ;将str这个偏移地址赋给dx
mov ah, 9h
int 21h ;当CPU读取到21H中断中的这个中断中的9H中断码时, CPU会取出dx中所保存的值当做字符数据的偏移地址, 这个时候相当于找到了DS:[20],当读取到 $ 时就会结束
mov ah , 4ch
int 21h
code end
end start
Call 和 ret 指令
-
Call指令和ret指令要配合使用
Call 指令, 相当于函数的调用
- Call 标号来调用
- 将下一条指令的偏移地址入栈
- 跳转到定位地址执行指令
ret 指令: 将栈顶的值pop给IP
- 任何函数在ret之前都会将函数内部声明的变量pop掉, 用来维持栈平衡, 保证sp指向的是下一条指令的地址
assume cs:code, ds:data, ss:stack
stack segment
db 20 dup(1) ; 定义20个字节作为栈段
stack ends
data segment
db 20 dup(2)
str db 'Hello world!$'
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov ax, 1122H
call print ;相当于函数调用
mov ax, 4ch
int 21h
print: ;为什么要写在中断之后呢?因为code会从上往下依次执行
mov ax, 3344h
push ax ; 进行了push操作后 必须进行pop保持栈平衡, 防止ret时pop的数据不是下一条指令的地址
mov dx, offset str ; 通过offset将str的偏移地址存入dx
mov ah, 9h ;
int 21h
pop ax
ret
code end
end start