考验你的汇编基本功(1)
很多人有这个感觉,越往后学感觉越模糊,越不清楚!没有前面的那么清晰!其实很简单,基础没有打好!前10章必须深入了解,尤其各个寄存器的使用方法,内存地址,循环,跳转,灵活寻址...题目要求:
1.把小写字母a—z,依次写入内存2000:0-19H处,如:abc...
2.然后把2000:0—19h处的字母,逆次存放在3000:0-19H处,并改变为大写如:ZYX...
3.最后依次把2000:0—19h和3000:0—19h的值相加,结果放在4000:0—19h处,如2000:0加3000:0的值放在4000:0 一直到2000:19h加3000:19h,放在4000:19h里面
不能用栈操作!不能事先定义数据,目的在考验对内存地址和寄存器使用的熟悉情况!
希望大家先不要看代码,先自己写完,然后在看代码
我写的代码如下:
以最易懂的方式写出,当然还有其他方法!大家自己测试
assume cs:qq
qq segment
mov ax,2000h
mov ds,ax
mov bx,0
mov cx,26
mov dh,61h
s:
mov ,dh
inc dh
inc bx
loop s
mov ax,3000h
mov es,ax
mov cx,26
mov si,0
mov bx,19h
s1:
mov ah,
sub ah,20h
mov es:,ah
inc si
sub bx,1
loop s1
mov cx,26
mov ax,4000h
mov ss,ax
mov bp,0
mov bx,0
mov si,0
s2:
mov ax,0
mov dx,0
mov al,
mov ah,es:
add al,ah
mov ss:,al
inc bx
inc si
inc bp
loop s2
mov ax,4c00h
int 21h
qq ends
end
抢个沙发{:5_109:} 板凳也要了 =。= :Q难~........... mark一下,这个我也做试试 地板{:7_168:} 本帖最后由 nbceshi 于 2011-12-25 22:54 编辑
assume cs:code
code segment
start: mov ax, 2000h
mov es, ax ;设置目标段地址
mov bx, 97 ;赋予bx的初始值a的ASCII码
mov cx, 26 ;共有26个字母
s: mov di, bx ;将偏移地址同步
mov es:, bl ;定位偏移地址,将字母写入目标地址
inc bx ;自增字母和偏移地址
loop s
mov ax, 3000h
mov ss, ax ;设置栈段地址
mov sp, 26 ;栈指针
mov di, 0 ;重新定位字母初始偏移地址
mov cx, 13 ;因按字操作,故设置13次循环
s1: mov ah, es: ;mov ax, es: ;取2个字母到ax
inc di ;xor ah, al ;交换字母位置
mov al, es: ;xor al, ah
inc di ;xor ah, al
and ax, 0dfdfh ;and ax, 0dfdfh ;转换为大写字母
push ax ;push ax ;入栈即存放指定位置
loop s1 ;add di, 2 ;准备取下2个字母
;loop s1
mov ax, 4000h ;取目标段地址
mov ds, ax
mov si, 0 ;将目标偏移地址置0
mov di, 0 ;将小写字母的初始偏移地址置0
mov cx, 13
s2: pop ax ;出栈2个字母到ax
add ax, es: ;加上小写字母的值
mov ds:, ax ;将计算后的值放入目标地址
add di, 2
add si, 2
loop s2
mov ax, 4c00h
int 21h
code ends
end start nbceshi 发表于 2011-12-25 22:52 static/image/common/back.gif
不能用栈操作!不能事先定义数据:L 试下,等我答案 本帖最后由 根号3 于 2011-12-28 19:39 编辑
assume cs:fang
fang segment
start:
mov ax,2000H
mov ds,ax
mov ax,3000H
mov es,ax
mov cx,1aH
mov si,19H
mov ax,61H
s:mov ,ax
and al,11011111B
mov es:,al ; 将al的值送到3000:0000处
or al,00100000B ;变成小写
inc bx
inc ax
sub si,1
loop s;完成第一和第二个要求
mov cx,1AH
s1:mov ax,
mov bx,es:
add al,bl
mov dx,4000H
mov es,dx
mov es:,al
mov dx,3000H
mov es,dx
inc di
loop s1
mov ax,4c00H
int 21H
fang ends
end start
手机写的……明天调试下……注释怎么不见了… 7楼用栈了 ! 貌似代码比我的还复杂。。。。。 assume cs:codecode segment
start: mov ax,2000h
mov ds,ax
mov si,0
mov ah,61h
mov cx,26
s:mov ,ah
inc si
inc ah
loop s
mov ax,3000h
mov es,ax
mov di,0
mov cx,26
s1:dec si
mov ah,
sub ah,20h
mov es:,ah
inc di
loop s1
mov si,19h
dec di
mov ax,4000h
mov ss,ax
mov bp,19h
mov cx,26
s3:mov al,
add al,
mov ,al
dec si
dec di
dec bp
loop s3
mov ax,4c00h
int 21h
code ends
end start assume cs:code
code segment
start: mov ax,2000h
mov ds,ax
mov si,0
mov ah,61h
mov cx,26
s: mov ,ah
inc si
inc ah
loop s
mov ax,3000h
mov es,ax
mov di,0
mov cx,26
s1: dec si
mov ah,
sub ah,20h
mov es:,ah
inc di
loop s1
mov si,19h
dec di
mov ax,4000h
mov ss,ax
mov bp,19h
mov cx,26
s3: mov al,
add al,
mov ,al
dec si
dec di
dec bp
loop s3
mov ax,4c00h
int 21h
code ends
end start 好难 看不懂:( 我想试一试 有点难度呀 本帖最后由 api 于 2011-12-28 19:33 编辑
assume cs:code
code segment
start:mov ax,2000h
mov ds,ax
mov dl,'a'
mov cx,1ah
s0: mov ds:,dl
inc dl
inc bl
loop s0
;<<<<<<<存入字节a-z到2000:0-19h中<<<<<<<<<<<<<<<<<<<<<<<<
mov ax,3000h
mov es,ax
mov bx,19h
mov si,0
mov cx,1ah
s1: mov dl,
and dl,11011111b
mov es:,dl
dec bl
inc si
loop s1
;<<<<<<<把2000:0-19h逆序存入3000:0-19h中<<<<<<<<<<<<<<<<<
mov ax,4000h
mov es,ax
mov si,0
mov di,0
mov cx,1ah
cld
rep movsb
mov ax,3000h
mov ds,ax
mov si,0
mov di,0
mov cx,1ah
s2: mov dl,
add es:,dl
inc si
inc di
loop s2
;<<<<<<<依次把2000:0—19h和3000:0—19h的值相加<<<<<<<<<<<<<
mov ax,4c00h
int 21h
code ends
end start我也来试试:lol api 发表于 2011-12-28 19:32 static/image/common/back.gif
我也来试试
请问你那个bl应该是写成61h吧, 好像不是bl吧, 还是我理解错了? 根号3 发表于 2011-12-28 19:44 static/image/common/back.gif
7楼用栈了 ! 貌似代码比我的还复杂。。。。。
呵呵,我没看完题就做了,不过你的不符合题意呀,题意要先第一步完成后再第二步,然后再第三步,不过思路不错,顶一个。
页:
[1]
2