汇编学习--第六天
(5)
這道題的寄存器會不夠,我們采取入棧出棧的方式來反復利用寄存器,這里的1,2,3定義的db,應該是"define byte",字節(jié)型數(shù)據(jù)
assume cs:code a segmentdb 1,2,3,4,5,6,7,8 a ends b segmentdb 1,2,3,4,5,6,7,8 b ends c segmentdb 0,0,0,0,0,0,0,0 c ends code segment start: mov ax,a ;a段地址mov ds,axmov ax,b ;b段地址mov es,axmov cx,8 ;循環(huán)次數(shù)mov bx,0 ;交換數(shù)據(jù)的偏移地址mov ax,0 ;臨時儲存a+b的數(shù)據(jù) s: mov al,es:[bx]add al,[bx]push ds ;ds入棧(這兩處入棧相當于找了個地方,保存之前ds,bx的值)push bx ;bx入棧mov bx,c ;c段地址mov ds,bxpop bx ;取出bxmov [bx],al ;將a+b之和賦值給對應的c段地址數(shù)據(jù)pop ds ;ds出棧,ds保存a段段地址inc bx ;偏移地址+1loop smov ax,4c00hint 21h code ends end start?
(6)
先將a段數(shù)據(jù)入棧,再出棧,儲存到b段對于位置
DS=075AH,所以程序入口地址在076AH,根據(jù)程序的代碼,我們知道先a段,再b段,a段占16字,32字節(jié)(1f),所以076A:0H~076A:1FH都是a段數(shù)據(jù),b段占8字,16字節(jié),所以b段在076C:0H~076C:FH
?
assume cs:code a segmentdw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segmentdw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,amov ds,axmov ax,bmov es,axmov bx,0mov cx,8 s0: mov ax,[bx]push axadd bx,2loop s0mov bx,0 s1: pop axmov es:[bx],axadd bx,2loop s1mov ax,4c00hint 21h code ends end start?
第七章 更靈活的定位內(nèi)存地址的方法
?
強烈建議先去把8.1~8.4看了,因為你在這章寫代碼踩的,有關[...]的坑,在8.1~8.4都有說明
?
7.1 and和or指令
(1)and指令:邏輯與指令,按位進行與運算
mov al,01100011B and al,00111011B?
(2)or指令...
mov al,01100011B or al,00111011B?
7.2 關于ASCII碼
?
7.3 以字符形式給出的數(shù)據(jù)
?
7.4 大小寫轉換問題
assume cs:codesg,ds:datasg datasg segmentdb 'BaSiC'db 'iNfOrMaTiOn' datasg ends codesg segment start: mov ax,datasgmov ds,axmov cx,5mov bx,0mov al,11011111b s: and ds:[bx],alinc bxloop smov cx,11mov bx,0mov al,00100000b s0: or ds:[bx],alinc bxloop s0mov ax,4c00hint 21h codesg ends end start?
7.5 [bx+idata]
指令
mov ax,[bx,200] ;(ax) = ( (ds) * 16 + (bx) + 200)?
等于
mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200?
問題 7.1
(ax)=00beh
(bx)=1000h
(cx)=0606h
?
7.6 用[bx+idata]的方式進行數(shù)組的處理
assume cs:codesg,ds:datasg datasg segmentdb 'BaSiC'db 'MinIX' datasg ends codesg segment start: mov ax,datasgmov ds,axmov cx,5mov bx,0s: mov al,11011111b and ds:[bx],almov al,00100000bor ds:5[bx],alinc bxloop smov ax,4c00hint 21h codesg ends end start?
?
?
7.7 SI 和 DI
si和di是8086CPU中和bx功能相近的寄存器si和di不能分成兩個8位寄存器
?
mov bx,0 mov ax,[bx]mov si,0 mov ax,[si]mov di,0 mov ax,[di]?
問題 7.2
書上代碼:
?
assume cs:codesg,ds:datasg datasg segmentdb 'welcome to masm!'db '................' datasg ends codesg segment start: mov ax,datasgmov ds,axmov si,0mov di,16mov cx,8 s: mov ax,[si]mov [di],axadd si,2add di,2loop smov ax,4c00hint 21h codesg ends end start?
?
寫的:
assume cs:codesg,ds:datasg datasg segmentdb 'welcome to masm!'db '................' datasg ends codesg segment start: mov ax,datasgmov ds,axmov si,0mov cx,16 s: mov al,[si]mov [si+16],alinc siloop smov ax,4c00hint 21h codesg ends end start?
不能直接給段寄存器賦值,要使用普通寄存器,不能給段存儲器:[偏移地址]使用直接賦值或者段寄存器賦值,這和前面的段寄存器一樣的。
?
問題 7.3
和自己寫的7.2一樣
?
7.8 [bx+si] 和 [bx+di]
[bx+si]也可以寫成[bx][si]
mov ax,[bx+si]mov ax,[bx][si]?
問題 7.4
(ax)=00BEH
(bx)=1000H
(cx)=0606H
?
7.9 [bx+si+idata] 和 [bx+di+idata]
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?
問題 7.5
ax=0006h
cx=6a00h
bx=226ah
?
7.10 不同的尋址方式的靈活應用
?
問題 7.6
開頭字母都在偏移地址3
assume cs:codesg,ds:datasg datasg segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options 'db '6. help ' datasg ends codesg segment start: mov ax,datasgmov ds,axmov si,3mov cx,6mov al,11011111b s: and [si],aladd si,10hloop smov ax,4c00hint 21h codesg ends end start?
?
問題 7.7
assume cs:codesg,ds:datasg datasg segmentdb 'ibm 'db 'dec 'db 'var 'db 'vec ' datasg ends codesg segment start: mov ax,datasgmov ds,axmov si,0mov cx,4s0: mov dx,cxmov bx,0mov cx,3 s: mov al,11011111band [bx+si],alinc bxloop sadd si,10hmov cx,dxloop s0mov ax,4c00hint 21h codesg ends end start?
?
?
?
?在上面的程序中,使用dx來臨時儲存外層循環(huán)cx的值,如果寄存器不夠怎么辦?兩種方法
1.入棧出棧
assume cs:codesg,ds:datasg datasg segmentdb 'ibm 'db 'dec 'db 'var 'db 'vec ' datasg ends codesg segment start: mov ax,datasgmov ds,axmov si,0mov cx,4s0: push cxmov bx,0mov cx,3 s: mov al,11011111band [bx+si],alinc bxloop sadd si,10hpop cxloop s0mov ax,4c00hint 21h codesg ends end start上面這個是自己寫的,雖然能夠得出正確答案,但是最好定一個棧空間
?
assume cs:codesg,ds:datasg,ss:stacksg datasg segmentdb 'ibm 'db 'dec 'db 'var 'db 'vec ' datasg ends stacksg segmentdw 0,0,0,0,0,0,0,0 stacksg ends codesg segment start: mov ax,datasgmov ds,axmov ax,stacksgmov sp,15mov ss,axmov si,0mov cx,4s0: push cxmov bx,0mov cx,3 s: mov al,11011111band [bx+si],alinc bxloop sadd si,10hpop cxloop s0mov ax,4c00hint 21h codesg ends end start?
?
?
第二種,cx放入內(nèi)存空間
assume cs:codesg,ds:datasg datasg segmentdb 'ibm 'db 'dec 'db 'var 'db 'vec 'dw 0 ;有段空間才能使用 datasg ends codesg segment start: mov ax,datasgmov ds,axmov si,0mov cx,4s0: mov ds:[40h],cx ;必須加上dsmov bx,0mov cx,3 s: mov al,11011111band [bx+si],alinc bxloop sadd si,10hmov cx,ds:[40h] ;必須加上dsloop s0mov ax,4c00hint 21h codesg ends end start?
為什么在[40h]必須加上ds,不然運行失敗?
因為在這里,我們使用另一個段寄存器來儲存cx數(shù)據(jù),而使用[40h]默認是ds段寄存器的地址,但我們儲存cx的段寄存器不一定是ds,可以命名其他的,所以需要加上。(見 8.3-(3) ))
?
問題 7.9
SI源變址寄存器,DI目地變址寄存器,兩者不能同時在[...]中使用,具體看點擊1--點擊2
assume cs:codesg,ds:codesg datasg segmentdb '1. display 'db '2. brows 'db '3. replace 'db '4. modify 'dw 0 datasg ends codesg segment start: mov ax,datasgmov ds,axmov bx,0mov cx,4s0: mov ds:[40],cxmov di,3 ;注意開始位置mov cx,4s: mov al,11011111band [bx+di],alinc diloop sadd bx,10hmov cx,ds:[40h]loop s0mov ax,4c00hint 21h codesg ends end start?
實驗 6? 實踐課程中的程序
前面已做
?
第八章 數(shù)據(jù)處理的兩個基本問題
?
reg(寄存器):ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;
?
sreg(段寄存器): ds, ss, cs, es;
?
8.1 bx,si,di和bp
https://www.cnblogs.com/Mayfly-nymph/p/11079189.html
?
8.2? 機器指令處理的數(shù)據(jù)在什么地方
機器指令進行數(shù)據(jù)處理:讀取,寫入,運算
?
指令執(zhí)行前,數(shù)據(jù)可存在于:CPU內(nèi)部,內(nèi)存,端口
| 機器碼 | 匯編指令 | 指令執(zhí)行前數(shù)據(jù)的位置 |
| 8E1E0000 | mov bx,[0] | 內(nèi)存,ds:0單元 |
| 89C3 | mov bx,ax | CPU內(nèi)部,ax寄存器 |
| BB0100 | mov bx,1 | CPU內(nèi)部,指令緩沖器 |
?
8.3 匯編語言中數(shù)據(jù)位置的表達
(1)立即數(shù)
直接包含在機器指令的數(shù)據(jù)(執(zhí)行前在CPU的指令緩沖器)
mov ax,1
add ax,5
or ax,00100000b
mov bl,'a'
?
(2)寄存器
指令要處理的數(shù)據(jù)在寄存器中,也就是給出寄存器
mov ax,bx
mov ds,ax
push bx
mov ds:[0],bx
push ds
mov ss,ax
mov sp,ax
?
(3)段地址(SA)和偏移地址(EA)
指令要處理在內(nèi)存中的數(shù)據(jù),可以用[X]的指令給出EA,SA在某個段寄存器中
段地址默認在ds中的
mov ax,[0]
mov ax,[di]
mov ax,[bx+di+8]
?
段地址默認在ss中的
mov ax,[bp]
mov ax,[bp+8]
mov ax,[bp+si+8]
?
顯性給出段寄存器地址
mov ax,ds:[bp]
mov ax,es:[bx]
mov ax,ss:[bx+si]
mov ax,cs:[bx+si+8]
??
轉載于:https://www.cnblogs.com/Mayfly-nymph/p/11074771.html
總結
- 上一篇: Java中字符串的常用属性与方法
- 下一篇: sort 与 sorted 区别: