《匯編語(yǔ)言程序設(shè)計(jì)》第8章:邏輯運(yùn)算.ppt
《《匯編語(yǔ)言程序設(shè)計(jì)》第8章:邏輯運(yùn)算.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《《匯編語(yǔ)言程序設(shè)計(jì)》第8章:邏輯運(yùn)算.ppt(43頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
匯編語(yǔ)言程序設(shè)計(jì) 朱耀庭 南開大學(xué)朱耀庭 第8章邏輯運(yùn)算 邏輯運(yùn)算指令是對(duì)字節(jié)或字中的各位進(jìn)行運(yùn)算的指令 即它是位運(yùn)算指令 在目前計(jì)算機(jī)廣泛應(yīng)用的情況下 計(jì)算機(jī)大量的工作不是進(jìn)行算術(shù)運(yùn)算 而是進(jìn)行信息處理 信息傳送 這些都需要做大量的位運(yùn)算 在研制系統(tǒng)軟件或進(jìn)行軟件開發(fā)中也需要大量的位運(yùn)算 本章結(jié)合二進(jìn)制數(shù)和BCD碼的輸入 輸出問(wèn)題來(lái)介紹邏輯運(yùn)算指令的應(yīng)用 與算術(shù)運(yùn)算指令一樣 邏輯運(yùn)算的結(jié)果也對(duì)標(biāo)志寄存器產(chǎn)生影響 希望同學(xué)們?cè)谡莆者壿嬤\(yùn)算指令及其程序設(shè)計(jì)的同時(shí) 關(guān)注邏輯運(yùn)算與條件轉(zhuǎn)移指令的關(guān)系 為分支程序設(shè)計(jì)奠定基礎(chǔ) 南開大學(xué)朱耀庭 第8章邏輯運(yùn)算 8 4邏輯運(yùn)算指令應(yīng)用 8 3循環(huán)移位指令 8 2移位指令 8 1邏輯運(yùn)算指令 南開大學(xué)朱耀庭 8 1邏輯運(yùn)算指令 南開大學(xué)朱耀庭 1 AND指令 格式 AND目的操作數(shù) 源操作數(shù)功能 AND將兩個(gè)操作數(shù) 字節(jié)或字 進(jìn)行按位 邏輯與 運(yùn)算 結(jié)果送回目的操作數(shù) 若原來(lái)的兩個(gè)操作數(shù)中的對(duì)應(yīng)位均為1 則結(jié)果中的該位置1 否則 該位置0 作用 用AND指令可以將一個(gè)字節(jié)或字中的某些特定位清零 或者說(shuō)將某些特定位截取下來(lái) AND指令執(zhí)行后 標(biāo)志CF 0 OF 0 PF SF ZF反映操作的結(jié)果 AF未定義 例如 設(shè)AL的每一位代表一個(gè)燈或開關(guān)狀態(tài) 1表示燈亮或開關(guān)ON 0表示燈滅或開關(guān)OFF 則指令 ANDAL 10111111B的作用就是關(guān)掉第6位所在位置的燈或開關(guān) 其他位對(duì)應(yīng)燈或開關(guān)狀態(tài)不變 而 ANDAL 01000000B的作用是關(guān)掉除第6位以外的燈或開關(guān) 而第6位的燈或開關(guān)保留原狀態(tài) 南開大學(xué)朱耀庭 2 TEST指令 格式 TEST目的操作數(shù) 源操作數(shù)功能 TEST對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯與運(yùn)算 但結(jié)果并不送至目的操作數(shù) 只是影響狀態(tài)標(biāo)志 此指令執(zhí)行后兩個(gè)操作數(shù)都不變 作用 這條指令常用來(lái)檢測(cè)一些條件是否滿足 但又不希望改變?cè)械牟僮鲾?shù)的情況 即適用于檢查一個(gè)字節(jié)或字中的某些特定位是否有一位為1 方法是 將要檢查的字節(jié)或字作為本指令的一個(gè)操作數(shù) 另一個(gè)操作數(shù)為指令要檢查的位的邏輯乘常數(shù) 如果測(cè)試結(jié)果 TEST指令執(zhí)行結(jié)果 不為0 即ZF 0 則說(shuō)明至少有一個(gè)特定位為1 因此 通常是在TEST指令后面跟上一條條件轉(zhuǎn)移指令 以便根據(jù)ZF是否為0來(lái)進(jìn)行轉(zhuǎn)移 南開大學(xué)朱耀庭 2 TEST指令 例如 設(shè)AL的每一位代表一個(gè)燈或開關(guān)狀態(tài) 1表示燈亮或開關(guān)ON 0表示燈滅或開關(guān)OFF 則程序段 TESTAL 01000000BJNZL 第6位對(duì)應(yīng)燈亮或開關(guān)ON轉(zhuǎn)標(biāo)號(hào)L執(zhí)行 第6位對(duì)應(yīng)燈滅或開關(guān)OFF轉(zhuǎn)標(biāo)號(hào)L執(zhí)行例如 檢查BL的低4位是否至少有一位為1的程序段可以書寫如下 TESTBL 0FHJEL ZF 1時(shí)轉(zhuǎn)L 即低4位全為0時(shí)轉(zhuǎn)L處 低4位至少有一位為1時(shí)的處理L 低4位全為0時(shí)的處理 南開大學(xué)朱耀庭 3 OR指令 邏輯或 邏輯加 格式 OR目的操作數(shù) 源操作數(shù)功能 OR指令將兩個(gè)操作數(shù) 字節(jié)或字 進(jìn)行按位邏輯加操作 并將結(jié)果送至目的操作數(shù) 如果兩個(gè)操作數(shù)中對(duì)應(yīng)位有一個(gè)為1或全為1 則結(jié)果的該位為1 否則 結(jié)果的該位為0 OR指令對(duì)狀態(tài)標(biāo)志的影響同AND指令 OR指令往往用于對(duì)字節(jié)或字的特定位置數(shù) 拼數(shù) 例如 ORAL 30H 將AL高4位拼上3又如 設(shè)AL的每一位代表一個(gè)燈或開關(guān)狀態(tài) 1表示燈亮或開關(guān)ON 0表示燈滅或開關(guān)OFF 則指令 ORAL 01000000B的作用就是打開第6位所在位置的燈或開關(guān) 其他位對(duì)應(yīng)燈或開關(guān)狀態(tài)不變 南開大學(xué)朱耀庭 4 XOR指令 邏輯異或 稱按位加 格式 XOR目的操作數(shù) 源操作數(shù)功能 XOR指令將兩個(gè)操作數(shù) 字節(jié)或字 進(jìn)行按位邏輯異或操作 并將結(jié)果送至目的操作數(shù) 如果兩個(gè)操作數(shù)中對(duì)應(yīng)位相同 均為0或均為1 則結(jié)果該位為0 否則 結(jié)果該位為1 該指令對(duì)狀態(tài)標(biāo)志的影響和AND指令相同 XOR指令適用于對(duì)一個(gè)數(shù) 字節(jié)或字 或一個(gè)數(shù)的特定位求反例如 將AL寄存器中數(shù)01011100B求反 只要邏輯異或常數(shù)0FFH 即8位全1 即可 MOVAL 01011100BXORAL 0FFH 10100011B AL 南開大學(xué)朱耀庭 4 XOR指令 邏輯異或 稱按位加 再如 將AL寄存器的中間4位求反 只要邏輯異或立即數(shù)00111100B 即3CH 即可XORAL 3CH又如 XORAL BLXORAL BL結(jié)果AL不變 在圖形顯示時(shí) 這一特性往往用于動(dòng)畫制作 想想為什么 南開大學(xué)朱耀庭 4 XOR指令 邏輯異或 稱按位加 注意 以上4個(gè)邏輯指令的兩個(gè)操作數(shù)均可以是同數(shù)據(jù)類型的寄存器操作數(shù) 或同數(shù)據(jù)類型的一個(gè)寄存器操作數(shù)和一個(gè)內(nèi)存操作數(shù) 或目的操作數(shù)是寄存器或存儲(chǔ)器 源操作數(shù)為立即數(shù) 例如 ANDALPHA DI 0FH ORGAMMA BX SI 3030H 其中GAMA為字變量 XORA 0FFH 其中A為字節(jié)變量TESTBYTEPTR DI 0F0H 南開大學(xué)朱耀庭 5 NOT指令 邏輯非 或叫求反碼 格式 NOT目的操作數(shù)功能 NOT指令對(duì)目的操作數(shù)的每一位求反碼 并將結(jié)果送回目的操作數(shù)此指令只有目的操作數(shù) 目的操作數(shù)可以是通用寄存器也可以是存儲(chǔ)器 具體操作是從0FFH 對(duì)于字節(jié)來(lái)說(shuō) 或從0FFFFH 對(duì)字來(lái)說(shuō) 中減去指定的操作數(shù) 并將結(jié)果送回目的操作數(shù) 此指令不改變狀態(tài)標(biāo)志 南開大學(xué)朱耀庭 8 2移位指令 南開大學(xué)朱耀庭 1 SHL指令 邏輯左移 格式 SHL目的操作數(shù) COUNT其中 目的操作數(shù)可以是通用寄存器 也可以是存儲(chǔ)器 功能 SHL指令將目的操作數(shù)左移COUNT次 位 最高位移入進(jìn)位標(biāo)志CF中去 而CF中原來(lái)的值被沖掉 移位后空出的最低位中填0 如圖8 1所示 圖8 1SHL指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 1 SHL指令 邏輯左移 移位次數(shù)COUNT若為1 則 SHL目的操作數(shù) 移位后目的操作數(shù)的最高位與CF不同 則將OF置1 否則OF 0 對(duì)于帶符號(hào)數(shù)來(lái)說(shuō) 這用來(lái)表示移位以后的符號(hào)位與移位前的符號(hào)位是否相同 若相同則OF 0 表示沒有產(chǎn)生超位結(jié)果 因?yàn)槊孔笠?位數(shù)值就擴(kuò)大1倍 移位次數(shù)COUNT不為1 則 MOVCL COUNT且SHL目的操作數(shù) CL 移位后OF的值不能確定 狀態(tài)標(biāo)志PF SF ZF表示移位后的結(jié)果 標(biāo)志AF 輔助進(jìn)位 總是不確定的 CF中總是包含從目的操作數(shù)中移出的最后一位的值 例如 SHLAL 1 將 AL 左移一位MOVCL 3 SHL AL CL 將 AL 左移3位 南開大學(xué)朱耀庭 1 SHL指令 邏輯左移 用SHL指令將一個(gè)無(wú)符號(hào)數(shù)左移1位等于將數(shù)倍增 乘2 用SHL指令使數(shù)倍增比用乘法指令速度快得多 可以通過(guò)CF是否為0檢查移位結(jié)果是否超位 比如 將8位數(shù)65 01000001B 左移1位得到130 10000010B 這時(shí)CF 0指明沒有超位 再將130左移1位得到4 00000100B 這時(shí)CF 1表明已超位 此時(shí)將OF置位 置1 因此通過(guò)檢查OF也可以知道是否超位 檢查超位的方法是在移位指令后面跟上一條測(cè)試CF 或OF 的條件轉(zhuǎn)移指令 例8 1讀以下程序 并且說(shuō)明輸入一個(gè)字符后輸出什么 南開大學(xué)朱耀庭 2 SHR指令 邏輯右移 格式 SHR指令格式和SHL相同 功能 將一個(gè)無(wú)符號(hào)數(shù)向右移位 左邊 最高位 出現(xiàn)空位補(bǔ)0 右邊 低位 移至CF 如圖8 2所示 此指令影響狀態(tài)標(biāo)志 CF OF PF SF ZF 但AF不確定 圖8 2SHR指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 2 SHR指令 邏輯右移 SHR指令適用于將一個(gè)無(wú)符號(hào)數(shù)減半 右移1位等于將數(shù)除以2 用SHR指令使數(shù)減半比用除法指令速度要快得多 另外 可以通過(guò)右移1位后看CF是否為0 檢查數(shù)是否為偶數(shù) CF為1表明此數(shù)不是偶數(shù) 比如將8位數(shù)11 0000101B 右移1位得到5 00000101 這時(shí)CF 1 故數(shù)11不是偶數(shù) 檢查的方法是在移位指令后跟上一條測(cè)試CF的條件轉(zhuǎn)移指令 南開大學(xué)朱耀庭 3 SAL指令 算術(shù)左移 SAL指令同SHL指令 實(shí)際上SHL和SAL是同一條指令的兩種助記符 它們執(zhí)行的操作完全一樣它一般用于帶符號(hào)位的數(shù)的倍增 乘2 對(duì)于帶符號(hào)的數(shù)檢查超位時(shí)只能測(cè)試OF 南開大學(xué)朱耀庭 4 SAR指令 算術(shù)右移 SAR指令類似于SHR指令 SAR同SHR的區(qū)別在于 SHR是連同符號(hào)位一起右移 左邊 最高位 出現(xiàn)的空位補(bǔ)0 而SAR右移時(shí)符號(hào)位不動(dòng) 保持不變 左邊 數(shù)的最高位 出現(xiàn)的空位補(bǔ)上符號(hào)位的值 SAR指令的操作如圖8 3所示 圖8 3SAR指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 4 SAR指令 算術(shù)右移 SAR指令適用于將帶符號(hào)位的數(shù)減半 除以2 例如 用SAR指令將8位數(shù) 8 00001000 右移1位得到 4 00000100 將8位數(shù) 120 10001000 右移1位得 60 110001000 另外 用SAR指令將 5 00000101 右移1位 減半 得 2 00000010 用SAR指令將 5 11111011 右移1位 減半 得 3 11111101 可見SAR將奇數(shù)右移1位時(shí) 總是得出比該數(shù)的一半還小的結(jié)果 值得注意的是 如果目的操作數(shù)為負(fù)的 且其中具有1的位數(shù)移出以后 則SAR指令產(chǎn)生的結(jié)果與用整數(shù)除IDIV指令產(chǎn)生的結(jié)果是不一樣的 例如 5經(jīng)SAR在右移1位之后得 3 而用IDIV作整數(shù) 5被2除后得 2 這是因?yàn)镮DIV指令將所有的數(shù) 包括正 負(fù) 向0進(jìn)行舍入 而SAR指令將正數(shù)向0進(jìn)行舍入 將負(fù)數(shù)向負(fù)無(wú)窮大進(jìn)行舍入 南開大學(xué)朱耀庭 4 SAR指令 算術(shù)右移 SAR影響狀態(tài)標(biāo)志有CF OF PF SF ZF綜上所述 移位指令可以對(duì)字節(jié) 8位 或字 16位 中的位進(jìn)行操作 指令的第一個(gè)操作數(shù)為目的操作數(shù) 目的操作數(shù)可以是通用寄存器 也可以是存儲(chǔ)器 各種尋址方式 指令的第二個(gè)操作數(shù)不是通常的源操作數(shù) 而是移位次數(shù)計(jì)數(shù)值操作數(shù) 一條指令可實(shí)現(xiàn)高達(dá)255次移位的操作 指令中的移位計(jì)數(shù)值可以指定為1 或指定為寄存器CL CL中包含移位次數(shù) 因此 需要事先將移位次數(shù)送入CL寄存器 南開大學(xué)朱耀庭 4 SAR指令 算術(shù)右移 移位指令對(duì)標(biāo)志的影響如下所述 1 在移位指令執(zhí)行后 AF總是不確定的 2 同邏輯指令 算術(shù)指令一樣 通常移位指令的結(jié)果也要影響SF ZF和PF 3 CF中總是含有從目的操作數(shù)中移出的最后一位的值 4 在執(zhí)行多位移位后 OF的內(nèi)容不確定 對(duì)于1位的移位操作 如果操作數(shù)的最高位 符號(hào)位 在指令執(zhí)行后被改變 OF就被置位 反之 如果操作數(shù)的最高位在指令執(zhí)行后仍保持原來(lái)的值 則OF被清零 南開大學(xué)朱耀庭 4 SAR指令 算術(shù)右移 在數(shù)的輸入 輸出過(guò)程中 乘10的操作是經(jīng)常要進(jìn)行的 8086 8088提供了乘法指令 乘10可以采用乘法指令來(lái)做 但是如果我們查閱一下8086 8088有關(guān)乘法指令的資料 可以知道 乘法指令執(zhí)行時(shí)間最短的是在寄存器中的兩個(gè)字節(jié)相乘 需要70個(gè)時(shí)鐘 而X 10 X 2 X 8 因此 將AL中的數(shù)乘10也可以采用移位和相加的辦法來(lái)實(shí)現(xiàn) 故可用以下程序段實(shí)現(xiàn)之 指令注解時(shí)鐘數(shù)SALAL 1 X 22MOVBL AL 送至BL暫存2SALAL 1 X 42SALAL 1 X 82ADDAL BL X 103 南開大學(xué)朱耀庭 4 SAR指令 算術(shù)右移 這樣 從指令的數(shù)量來(lái)說(shuō) 雖多了些 但是執(zhí)行時(shí)間卻要短得多 總共需要執(zhí)行時(shí)間為11個(gè)時(shí)鐘 其中 X 2也可以用X X來(lái)實(shí)現(xiàn) 因此X 10也可以用以下程序段實(shí)現(xiàn) 指令注解時(shí)鐘數(shù)ADDAL AL X 23MOVBL AL 送至BL暫存2ADDAL AL X 43ADDAL AL X 83ADDAL BT X 103總執(zhí)行時(shí)間為14個(gè)時(shí)鐘 因此 采用移位的方法實(shí)現(xiàn)乘10是較合適的 例8 2讀以下程序 并且說(shuō)明輸入一個(gè)字符后輸出什么 南開大學(xué)朱耀庭 8 3循環(huán)移位指令 南開大學(xué)朱耀庭 1 ROL指令 循環(huán)左移 ROL指令 每執(zhí)行一次 每移1位 把最高位移到最低位 同時(shí)還把最高位移到CF 其操作示意如圖8 4所示 圖8 4ROL指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 1 ROL指令 循環(huán)左移 當(dāng)循環(huán)移位次數(shù)為1時(shí) 若循環(huán)左移以后操作數(shù)的最高位不等于CF 則將溢出標(biāo)志OF置1否則OF 0 這可以用來(lái)表示移位前后的符號(hào)是否改變 OF 0 表示符號(hào)未變 ROL指令只影響狀態(tài)標(biāo)志CF和OF 例8 3讀以下程序 并且說(shuō)明輸入一個(gè)字符后輸出什么 南開大學(xué)朱耀庭 2 ROR指令 循環(huán)右移 ROR指令與ROL指令類似 只是目的操作數(shù) 字節(jié)或字 中的各位循環(huán)右移 而不是循環(huán)左移 操作示意如圖8 5所示 圖8 5ROR指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 3 RCL指令 通過(guò)進(jìn)位循環(huán)左移 RCL指令對(duì)目的操作數(shù)字節(jié)或字中的各位循環(huán)左移 進(jìn)位標(biāo)志CF被看作目的操作數(shù)的 一部分 每執(zhí)行一次 移動(dòng)1位 CF的值循環(huán)移入目的操作數(shù)的低位 而目的操作數(shù)的高位移入CF 操作示意如圖8 6所示 圖8 6RCL指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 4 RCR指令 通過(guò)進(jìn)位循環(huán)右移 RCR指令與RCL指令類似 只是各位循環(huán)右移 而不是循環(huán)左移 操作示意如圖8 7所示 圖8 7RCR指令操作過(guò)程 動(dòng)畫演示 南開大學(xué)朱耀庭 4 RCR指令 通過(guò)進(jìn)位循環(huán)右移 循環(huán)移位與算術(shù)或邏輯移位不同 循環(huán)移位時(shí)移出操作數(shù)的位并不丟失 而是循環(huán)送回操作數(shù)的另一端 移位的位數(shù)也由計(jì)數(shù)值操作數(shù) 即COUNT 規(guī)定 這一點(diǎn)和算術(shù)或邏輯移位指令一樣 計(jì)數(shù)值可以指定為常數(shù)1 或指定為CL寄存器 循環(huán)移位指令可以對(duì)字節(jié)或字進(jìn)行操作 因?yàn)樗鼘⒁瞥龅奈灰浦罜F 而且只要循環(huán)移位8位 對(duì)字節(jié) 或16位 對(duì)字 操作數(shù)就會(huì)恢復(fù)原狀 因此 可以利用循環(huán)移位后測(cè)試CF的方法測(cè)試字節(jié)或字的某一位是0還是1 方法是利用循環(huán)移位指令將要測(cè)試的那一位移入CF 然后由測(cè)試CF的條件轉(zhuǎn)移指令JC CF為1時(shí)轉(zhuǎn)移 或JNC CF為0時(shí)轉(zhuǎn)移 進(jìn)行測(cè)試 如果再想恢復(fù)操作數(shù)原來(lái)的值 只要繼續(xù)用同樣的循環(huán)移位指令移完8位或16位即可 RCL和RCR這兩條帶進(jìn)位標(biāo)志的循環(huán)移位指令將進(jìn)位標(biāo)志看作是操作數(shù)的擴(kuò)展部分 這就允許CF作為一位信息移入操作數(shù) 利用這一點(diǎn)可以實(shí)現(xiàn)多字節(jié)數(shù)的移位 南開大學(xué)朱耀庭 4 RCR指令 通過(guò)進(jìn)位循環(huán)右移 例如 若有一個(gè)雙字?jǐn)?shù) 它們或是放在兩個(gè)通用寄存器中 例如DX和AX 或是存放在連續(xù)的內(nèi)存字單元中 那么怎樣實(shí)現(xiàn)這4個(gè)字節(jié)數(shù)整個(gè)左移1位或整個(gè)右移1位呢 拿左移1位來(lái)說(shuō) 可以先使低16位左移1位 再把高16位左移1位 其中的困難在于如何將低16位中的最高位移至高16位的最低位 用邏輯左移指令可以把低16位中的最高位移至進(jìn)位標(biāo)志CF中 而要把高16位也左移一位 并且將CF的值移至它的低位 必須用帶進(jìn)位標(biāo)志循環(huán)左移指令RCL來(lái)完成 即可以用以下指令實(shí)現(xiàn)之 SHLAX 1RCLDX 1或SHLFIRST WORD 1RCLSECOND WORD 1 南開大學(xué)朱耀庭 8 4邏輯運(yùn)算指令應(yīng)用 BCD碼的輸入輸出 二進(jìn)制數(shù)的輸入 輸出 8 4 1 8 4 2 南開大學(xué)朱耀庭 8 4 1BCD碼的輸入輸出 例8 4非壓縮型BCD碼的輸入 ASCII碼轉(zhuǎn)換成非壓縮BCD碼 實(shí)例 題目 從鍵盤上輸入一個(gè)8位十進(jìn)制數(shù) 要求將它以真正的非壓縮型BCD碼的形式存放在內(nèi)存輸入緩沖區(qū) 設(shè)計(jì)思路 需要將輸入的十進(jìn)制數(shù)字 0 9 的ASCII碼轉(zhuǎn)換成對(duì)應(yīng)的BCD碼 0 9數(shù)字的ASCII碼為30H 31H 39H 因此 只要用邏輯指令A(yù)ND將其高4位清零 即為其對(duì)應(yīng)的非壓縮型BCD碼 為此 需要在數(shù)據(jù)段分配一個(gè)具有8個(gè)字節(jié)的內(nèi)存輸入緩沖區(qū) 假設(shè)從十進(jìn)制數(shù)的高位開始輸入 將輸入的數(shù)字轉(zhuǎn)換成對(duì)應(yīng)的BCD碼后從低地址字節(jié)開始依次存放 其實(shí)現(xiàn)程序如下 例8 4非壓縮型BCD碼的輸入實(shí)例 南開大學(xué)朱耀庭 8 4 1BCD碼的輸入輸出 例8 5非壓縮型BCD碼的輸出 非壓縮型BCD碼轉(zhuǎn)換成ASCII碼 實(shí)例 題目 將內(nèi)存緩沖區(qū)中的十進(jìn)制數(shù)字 非壓縮型BCD碼 顯示在屏幕上 設(shè)計(jì)思路 假設(shè)十進(jìn)制數(shù)字低位存放在低地址字節(jié) 輸出時(shí)應(yīng)從高位開始依次顯示出來(lái) 顯示輸出數(shù)字時(shí) 應(yīng)將0 9數(shù)字轉(zhuǎn)換成ASCII碼 即用OR指令將其高4位拼上3 例8 5非壓縮型BCD碼的輸出實(shí)例 南開大學(xué)朱耀庭 8 4 1BCD碼的輸入輸出 例8 6壓縮型BCD碼的輸入實(shí)例 題目 輸入數(shù)字字符以ASCII碼形式存到內(nèi)存中 然后轉(zhuǎn)換成壓縮型BCD碼重新存到內(nèi)存中 設(shè)計(jì)思路 從高位開始輸入十進(jìn)制數(shù)字 例如 3 2 4 9 5 以ASCII碼的形式從低地址字節(jié)開始依次存入ASC BUF 數(shù)字以空格鍵為結(jié)束 并且在接受數(shù)字字符時(shí)在CX寄存器里記下個(gè)數(shù) 若個(gè)數(shù)為奇數(shù)則將數(shù)字字符往后移動(dòng)一個(gè)字節(jié) 空出的第1個(gè)字節(jié)填入 0 并將個(gè)數(shù)加1使之為偶數(shù)個(gè) 因此 個(gè)數(shù)減半為轉(zhuǎn)換成壓縮型BCD碼后所占的字節(jié)數(shù) 將這個(gè)數(shù)字存入BCD BUF緩沖區(qū)的第1個(gè)字節(jié) 然后 將ASC BUF中的ASCII碼的高4位清0 并用邏輯指令和移位指令將它們每?jī)晌黄丛谝黄?成為壓縮型BCD形式存入BCD BUF 從低地址的第二個(gè)字節(jié)開始依次存放 例8 6壓縮型BCD碼的輸入實(shí)例 南開大學(xué)朱耀庭 8 4 1BCD碼的輸入輸出 例8 7壓縮型BCD碼的輸出 題目 將內(nèi)存緩沖區(qū) BUF 中的壓縮型BCD碼在屏幕上顯示輸出 設(shè)計(jì)思路 假設(shè)十進(jìn)制數(shù)字 壓縮型BCD碼 的低位放在低地址 因此輸出時(shí)需要從高地址 高位 開始 因?yàn)閴嚎s型BCD碼是一個(gè)字節(jié)里存放兩位十進(jìn)制數(shù)字 所以將一個(gè)字節(jié)里的BCD碼顯示輸出時(shí)需要將兩位BCD碼分離出來(lái) 方法是 用SHR指令將其右移4位 用OR指令拼上30H使之轉(zhuǎn)換成ASCII碼并顯示出來(lái) 然后用AND指令將這個(gè)字節(jié)的低4位截取下來(lái) 拼上30H顯示出來(lái) 例8 7壓縮型BCD碼的輸出 南開大學(xué)朱耀庭 8 4 1BCD碼的輸入輸出 說(shuō)明 若將一個(gè)8個(gè)字節(jié)長(zhǎng)的十進(jìn)制數(shù)字 16位 顯示輸出 用LOOP指令實(shí)現(xiàn)循環(huán)8次 則需用CX計(jì)循環(huán)次數(shù) 而用SHR指令右移4位時(shí)需要用CL計(jì)移位次數(shù) 這時(shí)就會(huì)將CX中循環(huán)的次數(shù)破壞掉 因此需要先將CX中的循環(huán)次數(shù)保存在一個(gè)存儲(chǔ)器或寄存器字里 比如BX 然后再將移位次數(shù)4送至CL 在LOOP指令前再將BX的值送回CX 以恢復(fù)CX的內(nèi)容 該程序執(zhí)行后輸出 9078008947500434 南開大學(xué)朱耀庭 8 4 2二進(jìn)制數(shù)的輸入 輸出 例8 8從鍵盤上輸入十六進(jìn)制數(shù)設(shè)計(jì)思路 從鍵盤上輸入的都是字符 即ASCII碼值 需要將其轉(zhuǎn)換成十六進(jìn)制的數(shù) 比如輸入 14A0 轉(zhuǎn)換成十六進(jìn)制數(shù)14A0H 存入一個(gè)字中 因此需要將0 9 A F的ASCII碼轉(zhuǎn)換成對(duì)應(yīng)的十六進(jìn)制數(shù)字 它們的對(duì)應(yīng)關(guān)系如下 ASCII碼 30H 31H 39H 41H 42H 46H十六進(jìn)制數(shù)字 00H 01H 09H 0AH 0BH 0F 由此可知 只要將0 的ASCII碼的高4位中的3去掉 就成為與其對(duì)應(yīng)的十六進(jìn)制數(shù)值了 而A F的ASCII碼比與之對(duì)應(yīng)的十六進(jìn)制數(shù)值均大37H 因此從ASCII碼中減去37H 剩下的就是相應(yīng)的十六進(jìn)制數(shù)值 例8 8從鍵盤上輸入十六進(jìn)制數(shù) 南開大學(xué)朱耀庭 8 4 2二進(jìn)制數(shù)的輸入 輸出 例8 9從鍵盤上輸入十進(jìn)制數(shù)并將其化為二進(jìn)制數(shù) 簡(jiǎn)稱 十化二 輸入 設(shè)計(jì)思路 實(shí)現(xiàn)十化二輸入的程序與十六進(jìn)制數(shù)的輸入程序極為相似 只需將輸入的數(shù)字0 9的ASCII碼轉(zhuǎn)換成對(duì)應(yīng)的數(shù)值送至AL 在把每一位十進(jìn)制數(shù)拼在一起時(shí) 首先將字緩沖區(qū)的內(nèi)容乘10 然后用算術(shù)加法指令A(yù)DD加上AX AH 0 的內(nèi)容 假設(shè)輸入十進(jìn)制數(shù)字以逗號(hào) 字符作為一個(gè)數(shù)的結(jié)果 例如 鍵入3456 或34 例8 9從鍵盤上輸入十進(jìn)制數(shù)并將其化為二進(jìn)制數(shù) 南開大學(xué)朱耀庭 8 4 2二進(jìn)制數(shù)的輸入 輸出 例8 10二化十輸出設(shè)計(jì)思路 假設(shè)把CX寄存器中的無(wú)符號(hào)整數(shù)進(jìn)行二化十輸出 則需要把CX中的數(shù)值轉(zhuǎn)換成BCD碼 也就是要檢查CX中的二進(jìn)制數(shù)包含有多少個(gè)10000 2710H 多少個(gè)1000 03E8H 多少個(gè)100 64H 多少個(gè)10 0AH 再把這些數(shù)以及剩下的個(gè)位數(shù)拼上30H 使之變成對(duì)應(yīng)的ASCII碼 一位一位地顯示出來(lái) 例8 10二化十輸出 用這種方法進(jìn)行二化十輸出不一定是個(gè)好的程序設(shè)計(jì)方法 而將無(wú)符號(hào)二進(jìn)制數(shù)用 除十取余 的方法化為十進(jìn)制數(shù)可能更好些 南開大學(xué)朱耀庭 ThankYou- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語(yǔ)言程序設(shè)計(jì) 匯編 語(yǔ)言程序設(shè)計(jì) 邏輯運(yùn)算
鏈接地址:http://m.appdesigncorp.com/p-6787337.html