小生我怕怕 发表于 2011-12-24 04:23:51

考验你的汇编基本功(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

灯火 发表于 2011-12-24 12:17:00

抢个沙发{:5_109:}

小栗子 发表于 2011-12-24 12:53:56

板凳也要了 =。=

彪悍二哥 发表于 2011-12-25 00:59:53

:Q难~...........

毛泽西 发表于 2011-12-25 10:38:52

mark一下,这个我也做试试

憔悴心只为你 发表于 2011-12-25 20:14:12

地板{:7_168:}

nbceshi 发表于 2011-12-25 22:52:27

本帖最后由 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

theron1988 发表于 2011-12-25 23:42:27

nbceshi 发表于 2011-12-25 22:52 static/image/common/back.gif


不能用栈操作!不能事先定义数据:L

小鸟江月 发表于 2011-12-25 23:57:40

试下,等我答案

根号3 发表于 2011-12-28 10:52:12

本帖最后由 根号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

根号3 发表于 2011-12-28 10:54:14

手机写的……明天调试下……注释怎么不见了…

根号3 发表于 2011-12-28 19:44:30

7楼用栈了 ! 貌似代码比我的还复杂。。。。。

宇内 发表于 2011-12-28 22:03:08

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

宇内 发表于 2011-12-28 22:03:43

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

紫炎 发表于 2011-12-28 22:28:57

好难 看不懂:(

bafengao 发表于 2011-12-28 18:15:46

我想试一试

bafengao 发表于 2011-12-28 18:16:33

有点难度呀

api 发表于 2011-12-28 19:32:00

本帖最后由 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

seuer126 发表于 2011-12-29 16:16:09

api 发表于 2011-12-28 19:32 static/image/common/back.gif
我也来试试

请问你那个bl应该是写成61h吧, 好像不是bl吧, 还是我理解错了?

nbceshi 发表于 2011-12-30 12:02:21

根号3 发表于 2011-12-28 19:44 static/image/common/back.gif
7楼用栈了 ! 貌似代码比我的还复杂。。。。。

呵呵,我没看完题就做了,不过你的不符合题意呀,题意要先第一步完成后再第二步,然后再第三步,不过思路不错,顶一个。
页: [1] 2
查看完整版本: 考验你的汇编基本功(1)