;实验8 这个程序可以正确返回吗? 运行后为什么是这种结果?
;assume cs:codesg
;codesg segment
; mov ax,4c00h ;ip=0
; int 21h ;ip=3
;start: mov ax,0 ;ip=5 ;程序入口
;s: nop ;ip=8 ;经过运行以下代码,此处机器码 90 变成 EBF6
; nop ;ip=9
; mov di,offset s ;ip=10 di=8H
; mov si,offset s2;ip=13 si=20H
; mov ax,cs:[si] ;ip=16 ax = cs:20 ----c-------[jmp short s1]
; mov cs:[di],ax ;ip=19 cs:8 = ax -----------[jmp short s1] copy了数据 EBF6 而不是指令
;s0 jmp short s ;ip=22 跳转到cs:8执行 jmp short s1
;s1: mov ax,0 ;ip=24
; int 21h ;ip=27
; mov ax,0 ;ip=29
;s2: jmp short s1 ;ip=32d=20H 机器码 EBF6 ;12-22 = -10 补码 11110110B 246D F6H
; nop ;ip=34
;codesg ends
;end start
;可以正确返回,运行结果:
;执行ip=16 → ax = [jmp short s1] ip=19→cs:8 = [jmp short s1] ip=22→跳转到cs:8执行
;(机器码跟原来的 EBF6 ,F6H=-10B) 向后移动10个字节 ip=0 → mov ax,4c00h int 21h
;实验9 根据材料编程 编程:在屏幕中间分别显示绿色\绿底红色\白底蓝色的字符串'welcome to masm!'
;B8000~BFFFF ■12行32列处输入字符串 B800:[780H+64]
;(780第12行 , 64是屏幕中间80-16=64,因为字符串+颜色码共32字节)
;RGB=红绿蓝 000=黑色 111=白色
;绿色 : 00000010 闪烁\R\G\B\高亮\R\G\B
;红底绿色: 01000010
;白底蓝色: 01110001
assume cs:code
data segment
db 'w e l c o m e t o m a s m ! '
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800H
mov es,ax
mov cx,16
mov bx,0
s: mov al,[bx]
mov es:[bx+64].8c0H,al
mov es:[bx+64].960H,al
mov es:[bx+64].0A00H,al
mov ah,00000010B ;或2h 写成2进制比较直观
mov es:[bx+65].8c0H,ah ;闪烁\背景R\G\B\高亮\前景R\G\B 1为开启 2为关闭
mov ah,01000010b ; 11111111B 则为闪烁高亮白字白背景
mov es:[bx+65].960H,ah
mov ah,01110001b
mov es:[bx+65].0A00H,ah
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start |