张国祥 发表于 2012-7-27 15:05:33

我发现我受小甲鱼影响,喜欢初始化寄存器,比如bx、si、di我都喜欢先置0

敉沧 发表于 2012-7-27 22:15:28

本帖最后由 敉沧 于 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 ,bl
            inc bx
            loop s2

            inc dx
            add si,10h
            pop cx
            loop s

            mov ax,4c00h
            int 21h

CG ends
end start

手机临时思路,没验证哈。。。
我发现我违反规定了。。用到了栈。。。

敉沧 发表于 2012-7-27 22:31:13

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 ,bl
            inc bx
            loop s2

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

            mov ax,4c00h
            int 21h

CG ends
end start

我改造了一下。

张国祥 发表于 2012-7-28 12:05:02

敉沧 发表于 2012-7-27 22:31 static/image/common/back.gif
assume cs:CG

DG segment


嗯,很不错~{:1_1:}

lukelqz 发表于 2012-7-28 12:26:21

敉沧 发表于 2012-7-27 22:31 static/image/common/back.gif
assume cs:CG

DG segment


mov ax,bx 这一步可以省了吧,省了后debug没有问题。貌似你这个写的是最简的了。{:5_106:}

敉沧 发表于 2012-7-28 12:42:57

lukelqz 发表于 2012-7-28 12:26
mov ax,bx 这一步可以省了吧,省了后debug没有问题。貌似你这个写的是最简的了。

呃,是的,我忘记删掉了。之前用到了ax。。。后来改了一下忘记删了。。。

天长地久 发表于 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 ,al
   dec bx
   dec al
   loop s
   sub bx,di
   mov cx,si
   loop s0
   mov ax,4c00h
   int 21h
code ends
end start


张国祥 发表于 2012-7-29 10:23:35

天长地久 发表于 2012-7-28 16:20 static/image/common/back.gif
我把代码也发上来!
assume cs:code   ;数字塔
data segment


很棒,代码20行都没到

Pasca1 发表于 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:                 movds:,al
                       dec bx
                       loop s
                       

                mov cx,dx

      add di,10h               
          loop d       
               

    mov ax,4c00h
    int 21h

code ends
end start       
               自测成功.    我有点投机取巧了

张国祥 发表于 2012-7-29 21:11:59

Pasca1 发表于 2012-7-29 10:53 static/image/common/back.gif
自测成功.    我有点投机取巧了

不错的,不管黑猫白猫,抓到老鼠的就是好猫!

离丶dong子 发表于 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语言
          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 ,dl            ;依次循环存入数据。
          inc si                  ;地址每次更新指向下一次要存入的地址空间。
          inc dl                  ;下一个存入的数据。
          loop s1


我的方法。
          
          ret
          
          code ends
          end dong
          
          
          
          

离丶dong子 发表于 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 ,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
          
          
          
          

过默 发表于 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:
          mov ,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

Pasca1 发表于 2012-7-30 23:01:28

本帖最后由 Pasca1 于 2012-7-30 23:06 编辑

离丶dong子 发表于 2012-7-29 22:14 http://bbs.fishc.com/static/image/common/back.gif


很超前.{:5_106:}

Pasca1 发表于 2012-7-30 23:05:07

张国祥 发表于 2012-7-29 21:11 static/image/common/back.gif
不错的,不管黑猫白猫,抓到老鼠的就是好猫!

   嗯当时 想过用db 256 dup(0) ..   不过方法一时没想出来   
   后来想的用00填充构建数字塔。

离丶dong子 发表于 2012-7-31 01:21:13

Pasca1 发表于 2012-7-30 23:01 static/image/common/back.gif
很超前.

{:5_109:}没事多出点新鲜题目,开拓一下思路{:5_109:}

静雨纷纷 发表于 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 ,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 ,al
                dec al
                cmp al,1
                jnb s3
                add bx,16
                loop s2
               
                mov ax,4c00h
                int 21h
codesg ends
end start
哈哈·
··闲着没事打一个玩的···
继续加油·····

张国祥 发表于 2012-7-31 03:55:36

静雨纷纷 发表于 2012-7-31 01:30 static/image/common/back.gif
assume cs:codesg
codesg segment
start:        mov ax,076ah


恩,不错,共同努力

张国祥 发表于 2012-7-31 03:59:48

离丶dong子 发表于 2012-7-29 22:36 static/image/common/back.gif
再贴一个,第一个贴的虽然啰嗦了点,但是我觉得封进子程序是个好习惯。

恩,利用call,ret的确不错。不过违背题目要求了哦
页: 1 [2]
查看完整版本: 给大家出道X86汇编题