汇编语言随笔(5)-and、or指令,串传送指令movsb、访问内存单元的方式及实验4,5(向内存传送数据)
and、or指令
??????and指令,邏輯與指令,按位進行與運算;or指令,邏輯或指令,按位進行或運算。
??????如:mov al,01100011B
?????? ?????? and al,00111011B
??????執行后:(al)=00100011B。用法:將操作數的某一位設置為0,其他位不變,如將al的第6位設置為0,and al 10111111B,或and al 0bfh。
??????如:mov al,01100011B
?????? ?????? ???or al,00111011B
??????執行后:(al)=01111011B。用法:將操作數的某一位設置為1,其他位不變,如將al的第6位設置為1,or al 01000000B,或or al 40h。
訪問內存
??????1,之前提到過采用中括號‘[ ]‘來訪問內存,在此對其做一補充:在匯編源程序中,如果采用常量作為內存的偏移地址時,應在前面顯示加上相應的段寄存器。如:mov ax,ds:[0],來指明內存數據的段地址在ds段寄存器中,偏移地址為0;
??????如果采用寄存器值作為內存的偏移地址時,則不需要這樣做,如:mov bx,0 ??????? mov ax,[bx] ,這兩種寫法是等價的。
??????其中用于顯示指明內存單元的段地址的段寄存器如’ds:’、‘es:’、‘cs:’、'ss:'稱為段前綴。
??????2,定義數據段空間:
??????db,定義字節數據(8位);dw,定義字型數據(16位);dd,定義雙字型數據(32位)。
??????db ‘…’,單引號中為字符串,定義字符串數據。如 db ’unIX‘ 它定義了4個字節大小的空間分別來存儲’u’的ASCII值75h,’n’的ASCII值6eh,’I’的ASCII值49h,’X’的ASCII值58h。等價于 db 75h,6eh,49h,58h
??????dup,常與db、dw、dd配合使用,用來進行數據的重復。例:db 3 dup(0),定義了3個字節,它們的值都是0,相當于db 0,0,0;db 3 dup(0,1,2),定義了9個字節,它們是0,1,2,0,1,2,0,1,2,相當于db 0,1,2,0,1,2,0,1,2。也可以配合 dw和dd來使用,用法都是一樣的。
??????3,定位內存單元的更多方法:
??????[bx+idata],段地址默認在ds中,也可顯式給出段地址。如:mov ax,[bx+200],將段地址在ds中,偏移地址為(bx)+200處的字型數據傳送到ax中。其他等價的格式為:mov ax,[200+bx],mov ax,200[bx],mov ax,[bx].200.。同樣的方式還有[si+idata]、[di+idata]、[bp+idata](含有bp的默認段地址在ss中)。
??????[bx+si],段地址默認在ds中,也可顯式給出段地址。如:mov ax,[bx+si],將段地址在ds中,偏移地址為(bx)+(si)處的字型數據傳送到ax中。其他等價的格式為:mov ax,[bx] [si]。同樣的方式還有[bx+di]、[bp+si]、[bp+di](含有bp的默認段地址在ss中)。
??????[bx+si+idata],段地址默認在ds中,也可顯式給出段地址。如:mov ax,[bx+si+200],將段地址在ds中,偏移地址為(bx)+(si)+200處的字型數據傳送到ax中。其他等價的格式為:mov ax,[bx+200+si],mov ax,[200+bx+si],mov ax,200[bx] [si],mov ax,[bx].200[si],mov ax,[bx] [si].200。同樣的方式還有[bx+di+idata]、[bp+si+idata]、[bp+di+idata](含有bp的默認段地址在ss中)。
例題
??????傳送數據:將內存ffff:0-ffff:b單元內的數據復制到0:200-0:20b單元中。
??????方法一:采用loop指令,具體如下:
??????方法二:采用DF標志和串傳送指令
??????其中df標志為flag的第10位,方向標志位。在串傳送指令中,它用來控制每次操作后si、di的增減。其中當df=0時,每次操作后si、di遞增;當df=1時,每次操作后si、di遞減。cld指令將標志寄存器的df位設置位0;std指令將df設置為1。
??????串傳送指令movsb,它的功能是將ds:si指向的內存單元中的字節送入es:di中,然后根據標志寄存器中df位的值,將si和di遞增或遞減。而movsw傳送的是字單元,用法與movsb類似,si、di每次加2或減2。
用法:rep movsb,根據cx中的值,重復執行串傳送指令,即傳送cx個字節。
??????故:
??????傳送的原始位置:ffff:0放入ds:si中
??????傳送的目的位置:0:200放入es:di中
??????傳送的長度:0ch放入cx中
??????傳送的方向:正方向,從而設置df為0
??????編碼如下:
實驗4
??????編程實現向內存0:200-0:23F依次傳送數據0-63(3FH),只能用9條指令。
mov ax,0020 更改內存地址的表示方式為0020:0-0020:3fmov ds,axmov bx,0mov cx,64s:mov [bx],bxinc bxloop smov ax,4c00hint 21h實驗5
??????有一條重要的結論:如果我們在定義一段棧段空間或數據段空間時,無論具體定義了多大的空間,最終被分配的空間大小都是16字節的整數倍。
??????如
??????上述代碼雖然定義的數據段只有兩個字,4個字節大小,但是在程序加載時分配的空間為16字節,后12個字節單元中的值均為0。棧段也是如此。
??????如果段中的數據占有N個字節,則程序加載后,該段實際占有的空間為(N/16+1)*16字節大小。
??????(5),編寫code中代碼,將a段和b段中的數據依次相加,將結果存到c段中。
??????(6),編寫code中代碼,用push指令將a段中的前8個字型數據,逆序存儲到b段中。
assum cs:codea segmentdw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffha endsb segmentdw 0,0,0,0,0,0,0,0b endscode segmentstart: mov ax,bmov ss,axmov sp,10h 將b段作為棧段mov ax,amov ds,axmov bx,0mov cx,8s: push [bx] 只需要依次入棧即可。(棧操作中的數據都為字型)add bx,2 注意:此處為加2.loop smov ax,4x00hint 21hcode endsend start總結
以上是生活随笔為你收集整理的汇编语言随笔(5)-and、or指令,串传送指令movsb、访问内存单元的方式及实验4,5(向内存传送数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言随笔(3)-条件转移指令和标志寄
- 下一篇: 汇编语言随笔(6)-大小写转换与实验6(