汇编语言4
程序0:把字符串 "adcdef"转换成大写, 把字符串 "FGHJK"转换成小写
data segment
db 'adcdef'
db 'XCVBNM'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,6
mov di,0
s: mov al,ds:[bx]
and al,1011111b
mov ds:[bx],al
mov al,ds:[bx+6]
or al,0100000b
mov ds:[bx+6],al
add bx,1
loop s
mov ax,4c00h
int 21h
code ends
end start
程序1:利用栈 逆序存放 dw 0111h,0222h,0333h,0444h,0555h,0666h,0777h,0888h
assume cs:code, ds:data, ss:stack
data segment
dw 0111h,0222h,0333h,0444h,0555h,0666h,0777h,0888h
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp, 020h
mov bx,0
mov cx,8
mov si,0
s: push [bx + si]
add si,2
loop s
mov si,0
mov cx,8
s1: pop [bx + si]
add si,2
loop s1
mov ax,4c00h
int 21h
code ends
end start
程序2:定义6个字 数据存放在cs:0 c单元中,累加存放ax中
assume cs:codesg
codesg segment
dw 0123h,0e32h,0a21h,0c43h,0344h,0544h
start:
mov bx,0
mov cx,6
mov ax,0
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al,0[bx]
and al,11011111b
mov 0[bx],al
mov al,5[bx]
or al,00100000b
mov 5[bx],al
inc bx
loop s
程序3:将 ffff:0-b 的数据按字节 复制到200-20b
assume cs:codesg
codesg segment
mov bx,0
mov cx,12
mov ax,0ffffh
mov ds,ax
mov ax,0020h
mov es,ax
s: mov dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end
程序4:运算 ffff:0-b 的数据和 存dx
assume cs:codesg
codesg segment
mov ax,0ffffh
mov ds,ax
mov dx,0
mov bx,0
mov cx,12
s:add al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end
程序5:补全下面的程序,使其可以将 10000H~1000FH 中的8个字,逆序复制到20000H~2000FH中。
mov ax, 2000H
mov ds, ax
mov ax,1000
mov ss,ax
mov sp,0
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
程序6:在debug中,用“d 0:0 1f”查看内存,结果如下
1000:0000 8E C1 36 52 73 70 65 63-69 66 69 65 64 20 66 69 ..6Rspecified fi
1000:0010 6C 65 6E 61 6D 65 0D 0A-20 20 20 20 20 20 20 20 lename..
mov ax,1000
mov ds,ax
mov ax,[0000] ax=c18e
mov bx,[0001] bx=36c1
mov ax,bx ax=36c1
mov ax,[0000] ax=c18e
mov bx,[0002] bx=5236
add ax,bx ax=13c4
add ax,[0004] ax=8437
mov ax,0 ax=0000
mov al,[0002] ax=0036
mov bx,0 bx=0
mov bl,[000c] bx=0064
add al,bl ax=009a
mov ax,1000
mov ds,ax
mov ax,2000
mov ss,ax
mov sp,10
push ds[0]
push ds[2]
push ds[4]
push ds[6]
push ds[8]
push ds[a]
push ds[c]
push ds[e]
程序7:下面的3条指令执行后、CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
MOV AX,BX
SUB AX,BX
JMP AX
答:修改了4次 IP=+2 ,IP=+2,IP=+2,IP=0
分析:
假设 CS=1500 IP=0100
第一次
CS:IP指向15100内存处,读取指令MOV AX,BX , 此时IP为=102,CS不变。
第二次
CS:IP指向15102内存处,读取指令SUB AX,BX , 此时IP为=104,CS不变。
第三次
CS:IP指向15104内存处,读取指令JMP AX , IP变更为=106(用于下次指向内存)
第四次 执行JMP AX IP=0
程序8:1.给定段地址为0001H,仅通过改变偏移地址寻址,CPU的寻址范围为(00010)到(1000F).
分析:偏移地址为16位,范围是0000--FFFF,给定了段地址那么就有 0001*16+0000 到 0001*16+FFFF,即00010到1000F。
2.有一数据存放在内存20000h 单元中,现给定段地址SA,若想用偏移地址寻到此单元。
则SA应满足的条件是:最小为(1001),最大为(2000)
分析:最小值: 20000-ffff=10001
10001*16 明显大于20000了,应该是1001
1001*16+fff0=20000
最大值:(20000-0)/16=2000