鱼C论坛

 找回密码
 立即注册
查看: 4654|回复: 26

[技术交流] 考验你的汇编基本功(1)

[复制链接]
发表于 2011-12-24 04:23:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
很多人有这个感觉,越往后学感觉越模糊,越不清楚!没有前面的那么清晰!其实很简单,基础没有打好!前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 [bx],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,[bx]
sub ah,20h
mov es:[si],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,[bx]
mov ah,es:[si]
add al,ah
mov ss:[bp],al
inc bx
inc si
inc bp
loop s2
mov ax,4c00h
int 21h
qq ends
end
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-24 12:17:00 | 显示全部楼层
抢个沙发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-24 12:53:56 | 显示全部楼层
板凳也要了 =。=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-25 00:59:53 | 显示全部楼层
:Q难~...........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-25 10:38:52 | 显示全部楼层
mark一下,这个我也做试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-25 20:14:12 | 显示全部楼层
地板{:7_168:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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:[di-97], 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:[di]         ;mov ax, es:[di]        ;取2个字母到ax        
                inc di                             ;xor ah, al                 ;交换字母位置         
                mov al, es:[di]               ;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:[di]                ;加上小写字母的值
                mov ds:[si], ax                ;将计算后的值放入目标地址
                add di, 2
                add si, 2
                loop s2
        
                mov ax, 4c00h
                int 21h

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-25 23:42:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-25 23:57:40 | 显示全部楼层
试下,等我答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 10:52:12 From FishC Mobile | 显示全部楼层
本帖最后由 根号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 [bx],ax
and al,11011111B
mov es:[si],al ; 将al的值送到3000:0000处
or al,00100000B ;变成小写
inc bx
inc ax
sub si,1
     loop s  ;完成第一和第二个要求

    mov cx,1AH
s1:mov ax,[di]
mov bx,es:[di]
add al,bl
mov dx,4000H
mov es,dx
mov es:[di],al
mov dx,3000H
mov es,dx
inc di
loop s1

mov ax,4c00H
int 21H
fang ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 10:54:14 From FishC Mobile | 显示全部楼层
手机写的……明天调试下……注释怎么不见了…
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 19:44:30 | 显示全部楼层
7楼用栈了 ! 貌似代码比我的还复杂。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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 [si],ah
  inc si
  inc ah
  loop s
  
  mov ax,3000h
  mov es,ax
  mov di,0
  mov cx,26
  
s1:  dec si
  mov ah,[si]
  sub ah,20h
  mov es:[di],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,[si]
  add al,[di]
  mov [bp],al
  dec si
  dec di
  dec bp
  loop s3
  
  
  mov ax,4c00h
  int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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 [si],ah
                inc si
                inc ah
                loop s
                
                mov ax,3000h
                mov es,ax
                mov di,0
                mov cx,26
                
s1:                dec si
                mov ah,[si]
                sub ah,20h
                mov es:[di],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,[si]
                add al,[di]
                mov [bp],al
                dec si
                dec di
                dec bp
                loop s3
                
                
                mov ax,4c00h
                int 21h        
        
code ends
        
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 22:28:57 | 显示全部楼层
好难 看不懂:(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 18:15:46 | 显示全部楼层
我想试一试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 18:16:33 | 显示全部楼层
有点难度呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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:[bx],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,[bx]
        and dl,11011111b
        mov es:[si],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,[si]
        add es:[di],dl
        inc si
        inc di
        loop s2
;<<<<<<<依次把2000:0—19h和3000:0—19h的值相加<<<<<<<<<<<<<
          
        mov ax,4c00h
        int 21h
          
code ends
end start
我也来试试  :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-29 16:16:09 | 显示全部楼层

请问你那个bl应该是写成61h吧, 好像不是bl吧, 还是我理解错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-30 12:02:21 | 显示全部楼层
根号3 发表于 2011-12-28 19:44
7楼用栈了 ! 貌似代码比我的还复杂。。。。。

呵呵,我没看完题就做了,不过你的不符合题意呀,题意要先第一步完成后再第二步,然后再第三步,不过思路不错,顶一个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 09:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表