鱼C论坛

 找回密码
 立即注册
查看: 5235|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-24 12:17:00 | 显示全部楼层
抢个沙发
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-24 12:53:56 | 显示全部楼层
板凳也要了 =。=
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-25 00:59:53 | 显示全部楼层
:Q难~...........
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-25 10:38:52 | 显示全部楼层
mark一下,这个我也做试试
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-25 20:14:12 | 显示全部楼层
地板{:7_168:}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-25 22:52:27 | 显示全部楼层
本帖最后由 nbceshi 于 2011-12-25 22:54 编辑
  1. assume cs:code

  2. code segment
  3. start:        mov ax, 2000h
  4.                 mov es, ax                        ;设置目标段地址
  5.                 mov bx, 97                       ;赋予bx的初始值a的ASCII码
  6.                 mov cx, 26                       ;共有26个字母
  7.         s:        mov di, bx                      ;将偏移地址同步
  8.                 mov es:[di-97], bl              ;定位偏移地址,将字母写入目标地址
  9.                 inc bx                                ;自增字母和偏移地址
  10.                 loop s
  11.                
  12.                 mov ax, 3000h
  13.                 mov ss, ax                        ;设置栈段地址
  14.                 mov sp, 26                        ;栈指针
  15.                 mov di, 0                        ;重新定位字母初始偏移地址
  16.                 mov cx, 13                    ;因按字操作,故设置13次循环
  17.         s1:        mov ah, es:[di]         ;mov ax, es:[di]        ;取2个字母到ax        
  18.                 inc di                             ;xor ah, al                 ;交换字母位置         
  19.                 mov al, es:[di]               ;xor al, ah                                                        
  20.                 inc di                             ;xor ah, al                                                        
  21.                 and ax, 0dfdfh              ;and ax, 0dfdfh         ;转换为大写字母
  22.                 push ax                        ;push ax                    ;入栈即存放指定位置
  23.                 loop s1                         ;add di, 2                   ;准备取下2个字母
  24.                                                         ;loop s1
  25.                 mov ax, 4000h                ;取目标段地址
  26.                 mov ds, ax
  27.                 mov si, 0                        ;将目标偏移地址置0
  28.                 mov di, 0                        ;将小写字母的初始偏移地址置0
  29.                 mov cx, 13
  30.         s2:        pop ax                                ;出栈2个字母到ax
  31.                 add ax, es:[di]                ;加上小写字母的值
  32.                 mov ds:[si], ax                ;将计算后的值放入目标地址
  33.                 add di, 2
  34.                 add si, 2
  35.                 loop s2
  36.         
  37.                 mov ax, 4c00h
  38.                 int 21h

  39. code ends
  40. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-25 23:42:27 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-25 23:57:40 | 显示全部楼层
试下,等我答案
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 10:54:14 From FishC Mobile | 显示全部楼层
手机写的……明天调试下……注释怎么不见了…
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 19:44:30 | 显示全部楼层
7楼用栈了 ! 貌似代码比我的还复杂。。。。。
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 22:03:43 | 显示全部楼层
  1. assume cs:code

  2. code segment
  3.        
  4. start:        mov ax,2000h
  5.                 mov ds,ax
  6.                 mov si,0
  7.                 mov ah,61h
  8.                 mov cx,26
  9.                
  10. s:                mov [si],ah
  11.                 inc si
  12.                 inc ah
  13.                 loop s
  14.                
  15.                 mov ax,3000h
  16.                 mov es,ax
  17.                 mov di,0
  18.                 mov cx,26
  19.                
  20. s1:                dec si
  21.                 mov ah,[si]
  22.                 sub ah,20h
  23.                 mov es:[di],ah
  24.                 inc di
  25.                 loop s1
  26.                
  27.                 mov si,19h
  28.                 dec di
  29.                 mov ax,4000h
  30.                 mov ss,ax
  31.                 mov bp,19h
  32.                 mov cx,26
  33.                
  34. s3:                mov al,[si]
  35.                 add al,[di]
  36.                 mov [bp],al
  37.                 dec si
  38.                 dec di
  39.                 dec bp
  40.                 loop s3
  41.                
  42.                
  43.                 mov ax,4c00h
  44.                 int 21h       
  45.        
  46. code ends
  47.        
  48. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 22:28:57 | 显示全部楼层
好难 看不懂:(
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 18:15:46 | 显示全部楼层
我想试一试
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 18:16:33 | 显示全部楼层
有点难度呀
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 19:32:00 | 显示全部楼层
本帖最后由 api 于 2011-12-28 19:33 编辑
  1. assume cs:code
  2. code segment
  3. start:mov ax,2000h
  4.         mov ds,ax
  5.         mov dl,'a'
  6.         mov cx,1ah
  7. s0:   mov ds:[bx],dl
  8.         inc dl
  9.         inc bl
  10.         loop s0
  11. ;<<<<<<<存入字节a-z到2000:0-19h中<<<<<<<<<<<<<<<<<<<<<<<<         
  12.          
  13.         mov ax,3000h
  14.         mov es,ax
  15.         mov bx,19h
  16.         mov si,0
  17.         mov cx,1ah
  18. s1:   mov dl,[bx]
  19.         and dl,11011111b
  20.         mov es:[si],dl
  21.         dec bl
  22.         inc si
  23.         loop s1
  24. ;<<<<<<<把2000:0-19h逆序存入3000:0-19h中<<<<<<<<<<<<<<<<<
  25.          
  26.         mov ax,4000h
  27.         mov es,ax
  28.         mov si,0
  29.         mov di,0
  30.         mov cx,1ah
  31.         cld
  32.         rep movsb
  33.         mov ax,3000h
  34.         mov ds,ax
  35.         mov si,0
  36.         mov di,0
  37.         mov cx,1ah
  38. s2:   mov dl,[si]
  39.         add es:[di],dl
  40.         inc si
  41.         inc di
  42.         loop s2
  43. ;<<<<<<<依次把2000:0—19h和3000:0—19h的值相加<<<<<<<<<<<<<
  44.          
  45.         mov ax,4c00h
  46.         int 21h
  47.          
  48. code ends
  49. end start
复制代码
我也来试试  :lol
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-29 16:16:09 | 显示全部楼层

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

呵呵,我没看完题就做了,不过你的不符合题意呀,题意要先第一步完成后再第二步,然后再第三步,不过思路不错,顶一个。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-28 03:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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