鱼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 | 显示全部楼层
assume cs:code,ds:data
data segment
db 16 dup(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
data ends
code segment
start:

         mov ax,data
                 mov ds,ax

                 mov di,0
                 mov ax,0
         


                mov cx,15
d:                mov dx,cx

    
                       mov bx,0fh
s:                 mov  ds:[bx+di],al
                         dec bx
                         loop s
                         

                mov cx,dx

        add di,10h                
            loop d        
                 

    mov ax,4c00h
    int 21h

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

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

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

data ends

code segment

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


我的方法。
          
          ret
          
          code ends
          end dong
          
          
          
          
未命名.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 22:36:08 | 显示全部楼层
再贴一个,第一个贴的虽然啰嗦了点,但是我觉得封进子程序是个好习惯。
assume cs:code
data segment
db 256 dup(0)           ;申请一段数据地址
data ends
code segment
dong: mov ax,data
      mov ds,ax
          mov bx,0
          mov ax,1
          mov cx,16
          s:
          mov di,cx
          mov dl,0
          mov si,0
          mov cx,ax
          s1:
          mov [bx+si],dl
          inc dl
          inc si
          loop s1
          
          add bx,16
          mov cx,di
          inc ax
          loop s
          
          mov ax,4c00h
          int 21h            
          code ends
          end dong
          
          
          
          
想知道小甲鱼最近在做啥?请访问 -> 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-11-20 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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