鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 张国祥

[争议讨论] 给大家出道X86汇编题

[复制链接]
 楼主| 发表于 2012-7-27 15:05:33 | 显示全部楼层
我发现我受小甲鱼影响,喜欢初始化寄存器,比如bx、si、di我都喜欢先置0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-27 22:15:28 From FishC Mobile | 显示全部楼层
本帖最后由 敉沧 于 2012-7-27 22:28 编辑

assume cs:CG

DG segment

      db 256 dup (0)    ;每行16字符,共16行,故16*16

DG ends

CG segment

start     :mov si,DG
              mov ds,si
              xor si,si    ;或者sub si,si也行,个人感觉效率比mov si,0快,而且少占了1字节。

              mov dx,1
              mov cx,16

s           :push cx
              mov cx,dx
              xor bx,bx
              mov ax,bx

s2         :mov [si+bx],bl
              inc bx
              loop s2

              inc dx
              add si,10h
              pop cx
              loop s

              mov ax,4c00h
              int 21h

CG ends
end start

手机临时思路,没验证哈。。。
我发现我违反规定了。。用到了栈。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-27 22:31:13 From FishC Mobile | 显示全部楼层
assume cs:CG

DG segment

      db 256 dup (0)    ;每行16字符,共16行,故16*16

DG ends

CG segment

start     :mov si,DG
              mov ds,si
              xor si,si    ;或者sub si,si也行,个人感觉效率比mov si,0快,而且少占了1字节。

              mov dx,1
              mov cx,16

s           :mov di,cx
              mov cx,dx
              xor bx,bx
              mov ax,bx

s2         :mov [si+bx],bl
              inc bx
              loop s2

              inc dx
              add si,10h
              mov cx,di
              loop s

              mov ax,4c00h
              int 21h

CG ends
end start

我改造了一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-28 12:05:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-28 12:26:21 | 显示全部楼层
敉沧 发表于 2012-7-27 22:31
assume cs:CG

DG segment

mov ax,bx 这一步可以省了吧,省了后debug没有问题。貌似你这个写的是最简的了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-28 12:42:57 From FishC Mobile | 显示全部楼层
lukelqz 发表于 2012-7-28 12:26
mov ax,bx 这一步可以省了吧,省了后debug没有问题。貌似你这个写的是最简的了。


呃,是的,我忘记删掉了。之前用到了ax。。。后来改了一下忘记删了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-28 16:20:48 | 显示全部楼层
我把代码也发上来!
assume cs:code   ;数字塔
data segment
  db 256 dup (0)
data ends
code segment
start: mov ax,data
     mov ds,ax
     mov bx,255
     mov di,1
     mov dx,1
     mov ax,15
     mov cx,15
s0:    mov si,cx
     mov ax,cx
     inc di
s:    mov [bx],al
     dec bx
     dec al
     loop s
     sub bx,di
     mov cx,si
     loop s0
     mov ax,4c00h
     int 21h
code ends
end start


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 10:23:35 | 显示全部楼层
天长地久 发表于 2012-7-28 16:20
我把代码也发上来!
assume cs:code   ;数字塔
data segment

很棒,代码20行都没到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 10:53:12 | 显示全部楼层
  1. assume cs:code,ds:data
  2. data segment
  3. db 16 dup(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
  4. data ends
  5. code segment
  6. start:

  7.          mov ax,data
  8.                  mov ds,ax

  9.                  mov di,0
  10.                  mov ax,0
  11.          


  12.                 mov cx,15
  13. d:                mov dx,cx

  14.    
  15.                        mov bx,0fh
  16. s:                 mov  ds:[bx+di],al
  17.                          dec bx
  18.                          loop s
  19.                          

  20.                 mov cx,dx

  21.         add di,10h               
  22.             loop d       
  23.                  

  24.     mov ax,4c00h
  25.     int 21h

  26. code ends
  27. end start       
  28.                  
复制代码
自测成功.    我有点投机取巧了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 21:11:59 | 显示全部楼层
Pasca1 发表于 2012-7-29 10:53
自测成功.    我有点投机取巧了

不错的,不管黑猫白猫,抓到老鼠的就是好猫!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 22:14:13 | 显示全部楼层
  1. assume cs:code
  2. data segment

  3. db 256 dup(0)           ;申请一段数据地址

  4. data ends

  5. code segment

  6. dong: mov ax,data
  7.       mov ds,ax
  8.           mov bx,0
  9.           mov ax,0              
  10.           s:                       ;第一层循环,考虑到不能用栈,我就没用loop循环。
  11.           call shu                     
  12.           add bx,16                ;每内循环结束后,偏移地址,指向下一行的首地址。
  13.           inc ax                   ;用于循环相当于 C语言 [a=0;a<=16;a++]
  14.           cmp ax,16                ;同上如果AX大于16则跳到程序结尾。
  15.           ja jieshu
  16.           jmp short s              ;若AX不大于16.跳到S继续循环程序。
  17.           
  18.           jieshu:
  19.           mov ax,4c00h
  20.           int 21h
  21.           
  22.           shu:                      ;内循环
  23.           mov si,0                  ;设置一个偏移用于输入数据列的偏移地址。
  24.           mov dl,0                  ;设置一个字节数据,送给指定的内存地址。
  25.           mov cx,ax                 ;设置循环次数
  26.           inc cx                    ;加1,这里自己考虑一下 ~.~
  27.           s1:
  28.           mov [bx+si],dl            ;依次循环存入数据。
  29.           inc si                    ;地址每次更新指向下一次要存入的地址空间。
  30.           inc dl                    ;下一个存入的数据。
  31.           loop s1


  32. 我的方法。
  33.           
  34.           ret
  35.           
  36.           code ends
  37.           end dong
  38.           
  39.           
  40.           
  41.           
复制代码
未命名.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 22:36:08 | 显示全部楼层
再贴一个,第一个贴的虽然啰嗦了点,但是我觉得封进子程序是个好习惯。
  1. assume cs:code
  2. data segment
  3. db 256 dup(0)           ;申请一段数据地址
  4. data ends
  5. code segment
  6. dong: mov ax,data
  7.       mov ds,ax
  8.           mov bx,0
  9.           mov ax,1
  10.           mov cx,16
  11.           s:
  12.           mov di,cx
  13.           mov dl,0
  14.           mov si,0
  15.           mov cx,ax
  16.           s1:
  17.           mov [bx+si],dl
  18.           inc dl
  19.           inc si
  20.           loop s1
  21.           
  22.           add bx,16
  23.           mov cx,di
  24.           inc ax
  25.           loop s
  26.           
  27.           mov ax,4c00h
  28.           int 21h            
  29.           code ends
  30.           end dong
  31.           
  32.           
  33.           
  34.           
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-30 21:46:49 | 显示全部楼层
assume cs:code,ds:data,es:table

data segment

    db 256 dup (0)

data ends

table segment

    db 00h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh  

table ends

code segment

   start:

          mov ax,data
          mov ds,ax
          mov ax,table
          mov es,ax
          mov ax,0
          mov dx,1
          mov cx,16
     s0:  mov bx,cx
          mov si,0
          mov cx,dx
      s:  mov al,es:[si]
          mov [bp+si],al
          inc si
          loop s
          add dx,1
          add bp,16
          mov cx,bx
          loop s0

          mov ax,4c00h
          int 21h
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-30 23:01:28 | 显示全部楼层
本帖最后由 Pasca1 于 2012-7-30 23:06 编辑


很超前.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-30 23:05:07 | 显示全部楼层
张国祥 发表于 2012-7-29 21:11
不错的,不管黑猫白猫,抓到老鼠的就是好猫!

   嗯  当时 想过用db 256 dup(0) ..   不过方法一时没想出来   
     后来想的用00填充构建数字塔  。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-31 01:21:13 | 显示全部楼层

没事多出点新鲜题目,开拓一下思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-31 01:30:59 | 显示全部楼层
assume cs:codesg
codesg segment
start:        mov ax,076ah
                mov ds,ax
                mov bx,0
               
                mov cx,256
s1:                mov word ptr [bx],0
                inc bx
                loop s1
               
                mov bx,16
                mov ax,0
               
                mov cx,15
s2:                mov al,16
                sub al,cl
s3:                mov si,ax
                mov byte ptr [bx+si],al
                dec al
                cmp al,1
                jnb s3
                add bx,16
                loop s2
               
                mov ax,4c00h
                int 21h
codesg ends
end start
哈哈·
··闲着没事  打一个玩的···
继续加油·····
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-31 03:55:36 | 显示全部楼层
静雨纷纷 发表于 2012-7-31 01:30
assume cs:codesg
codesg segment
start:        mov ax,076ah

恩,不错,共同努力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-31 03:59:48 | 显示全部楼层
离丶dong子 发表于 2012-7-29 22:36
再贴一个,第一个贴的虽然啰嗦了点,但是我觉得封进子程序是个好习惯。

恩,利用call,ret的确不错。不过违背题目要求了哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-1 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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