日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编学习--第六天

發(fā)布時間:2024/8/26 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编学习--第六天 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(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ù)的位置
8E1E0000mov bx,[0]內(nèi)存,ds:0單元
89C3mov bx,axCPU內(nèi)部,ax寄存器
BB0100mov bx,1CPU內(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

總結

以上是生活随笔為你收集整理的汇编学习--第六天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。