汇编语言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

posted @ 2015-05-25 16:16  鑫鑫1  阅读(363)  评论(0编辑  收藏  举报