• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Assembly Loop

            Posted on 2016-04-27 22:01 eryar 閱讀(1279) 評論(0)  編輯 收藏 引用

            Assembly Loop

            eryar@163.com

            我覺得循環指令是程序的核心,是計算機不厭其煩地執行機械、重復枯燥勞動的基礎。本文來學習下匯編程序中的LOOP指令。Loop指令的格式是:loop 標號,CPU執行loop指令的時候,要進行兩步操作:

            v (cx)=(cx)-1

            v 判斷cx中的值,不為零則轉到標號處執行程序,如果為零則向下執行。

            由上可知,cx中的值影響著loop指令的執行結果。通常我們用loop指令來實現循環功能,用cx來存放循環次數。類似于C中的for循環:

            for (int i = cx; i != 0--i) 


            學習了loop后,想著把原來那個輸出WELCOME TO ASM!的程序修改下,利用循環來實現。

             

            assume cs:codeseg

            codeseg segment
                ;WELCOME TO ASM
            ! (15)
                dw 0257h,0245h,034ch,0443h,054fh,064dh,0745h,0220h,0854h,094fh,0220h,1241h,1353h,144dh,1521h
                
                mov bx,0b800h
                mov ds,bx
                
                mov bx,
            0
                mov cx,
            15
                
                output:  mov ax,cs:[bx]
                    mov ds:[bx],ax
                    add bx,
            2
                    loop output
                
                mov ax,4c00h
                
            int 21h
            codeseg ends

            end 


            改成這樣后,編譯、連接成功,但是程序運行時好像進入了死循環。最后看書中的描述才找到了原因:那是因為用dw在代碼段定義了數據后,當程序運行時IP指向的是數據部分,并不是指令部分,所以導致運行出錯。使程序成功運行的方法有可以在debug中手動修改IP,使其指向真正的指令開始的地方,可是這樣一來程序只能在debug中才能正確運行。如何讓程序編譯、連接后可以在系統中直接運行呢?我們可以在源碼中指定程序的入口所在,即在源碼的第一條指令的前面加上一個標號main,而這個標號在偽指令end的后面出現。因為我覺得這有點像C中的main函數,所以將這個標號命名為main,修改程序后程序運行正確:

             

            assume cs:codeseg

            codeseg segment
                ;WELCOME TO ASM
            ! (15)
                dw 0257h,0245h,034ch,0443h,054fh,064dh,0745h,0220h,0854h,094fh,0220h,1241h,1353h,144dh,1521h
                
                main: mov bx,0b800h
                mov ds,bx
                
                mov bx,
            0
                mov cx,
            15
                
                output:  mov ax,cs:[bx]
                    mov ds:[bx],ax
                    add bx,
            2
                    loop output
                
                mov ax,4c00h
                
            int 21h
            codeseg ends

            end main

            程序運行結果如下圖所示:

            wps_clip_image-38

            綜上所述,將數據放到代碼段CS中時,會導致IP還是指向的CS的開始部分,而起始部分并不是指令,而是數據,從而導致程序直接運行時出現問題。為了解決這個問題,可以在指令起始的地方加個標號,這樣就好了。

            精品多毛少妇人妻AV免费久久| 日产久久强奸免费的看| 思思久久精品在热线热| 亚洲国产精品无码成人片久久| 久久笫一福利免费导航 | 久久精品国产色蜜蜜麻豆 | 久久精品无码一区二区日韩AV| 99久久婷婷国产一区二区| 女人香蕉久久**毛片精品| 武侠古典久久婷婷狼人伊人| 久久天天躁狠狠躁夜夜2020老熟妇 | 色偷偷91久久综合噜噜噜噜| 无码人妻久久一区二区三区免费丨| 青青青青久久精品国产h| 久久99精品国产一区二区三区| 精品人妻伦九区久久AAA片69| 久久久久人妻精品一区三寸蜜桃| 久久久久免费精品国产| 麻豆精品久久精品色综合| 久久久国产亚洲精品| 国产69精品久久久久99尤物| 久久香蕉超碰97国产精品| 久久综合亚洲色HEZYO国产| 99国产精品久久久久久久成人热| 亚洲va久久久噜噜噜久久男同| 国产成人精品久久一区二区三区av| 99久久精品免费看国产一区二区三区| 亚洲国产精久久久久久久| 日本人妻丰满熟妇久久久久久| 色综合久久久久综合99| 亚洲国产精品久久久久久| 亚洲αv久久久噜噜噜噜噜| 久久天天躁狠狠躁夜夜不卡| 国内精品久久久久久久亚洲| 国产高潮国产高潮久久久91 | 精品久久久无码人妻中文字幕豆芽| 久久精品免费大片国产大片| 久久夜色精品国产欧美乱| 狠狠色综合网站久久久久久久高清| 亚洲精品乱码久久久久久不卡| 久久精品无码一区二区三区免费|