freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

80x86匯編語言程序設計(第2版)習題答案-資料下載頁

2025-04-14 11:14本頁面
  

【正文】 push cx dec al cmp al, 0ah jne Skip mov al, 0Skip: add al, 30h mov ah, 0eh int 10h pop cx pop ax retDispDigit endpcseg ends end Main811IntNo equ 9CR equ 0dhLF equ 0ahLowDigitScan equ 02hHighDigitScan equ 0bhShiftBits equ 11bKbdFlags equ byte ptr ds:[17h] cseg segment para public 39。code39。OldInt9 dd ?。 Int9 鍵盤ISR。 檢測用戶按下的鍵。若是主鍵盤上的數字鍵且當前Shift鍵未按下,則忽略。 否則,傳遞給原INT 9 ISR。MyInt9 proc far sti push ds push ax push cx mov ax, 40h mov ds, ax xor cx, cxWaitData: in al, 64h test al, 01b loopz WaitData jz QuitInt9 in al, 60h 。 讀掃描碼 cmp al, LowDigitScan jb OrigInt9 cmp al, HighDigitScan ja OrigInt9 mov dl, KbdFlags 。 判斷Shift是否按下 and dl, ShiftBits jnz OrigInt9QuitInt9: mov al, 20h out 20h, al 。 發(fā)送中斷結束信號 pop cx pop ax pop ds iretOrigInt9: pop cx pop ax pop ds pushf call cs:OldInt9 iretMyInt9 endpcseg endsEndResident segment para public 39。EndRes39。EndResident endscseg1 segment para public 39。code139。 assume cs:cseg1, ds:cseg PSP dw ?Main proc mov cs:PSP, ds mov ax, cseg mov ds, ax mov ax, 0 mov es, ax cli mov ax, es:[IntNo*4] mov word ptr OldInt9, ax mov ax, es:[IntNo*4 + 2] mov word ptr OldInt9+2, ax mov es:[IntNo*4], offset MyInt9 mov es:[IntNo*4+2], ds sti 。 顯示安裝信息 call Print db 39。Key Filter Installed.39。, CR, LF, 0。 終止并駐留 mov dx, EndResident sub dx, cs:PSP mov ax, 3100h int 21hMain endpPrint proc push bp mov bp, sp push ax push bx mov bx, 2[bp]PrintChar: mov al, cs:[bx] cmp al, 0 jz Done mov ah, 0eh int 10h inc bx jmp PrintCharDone: inc bx mov 2[bp], bx pop bx pop ax pop bp retPrint endpcseg1 endssseg segment para stack 39。stack39。 dw 512 dup (?)sseg ends end Main第9章91 在32位保護模式下,程序中使用48位邏輯地址(或虛擬地址),包括16位段選擇符和32位偏移地址。其中,16位段選擇符通常在某個段寄存器中。92 在實模式下,段寄存器存放的是16位段地址;在保護模式下,段寄存器存放的是16位段選擇符。93 根據程序中的48位邏輯地址,CPU使用其中的16位段選擇符檢索描述符表。描述符表中的每一項是段描述符,包含了段的基地址。CPU取出描述符中的32位基地址,加上邏輯地址中的32位偏移地址,得到一種中間形式的地址,被稱為線性地址。若系統(tǒng)未啟用分頁機制,則線性地址就是物理地址;否則,由分頁部件再轉換成物理地址。物理地址才是真正放到總線上并被內存譯碼的地址。94 設中斷號為n,則在實模式下,中斷向量(即中斷服務程序入口地址)所在地址為4n~4n+3,其中存放的4個字節(jié)就是中斷服務程序入口的32位分段地址。在保護模式下,首先根據中斷號n與IDTR寄存器,從IDT中定位相應的門描述符,即中斷門描述符地址 = IDT起始地址 + n 88字節(jié)中斷門描述符中存放的16位段選擇符與32位偏移地址就構成了中斷服務程序入口的48位邏輯地址。95 對于運行在低特權級下的應用程序,其操作要受到如下限制:(1)不能使用特權指令,如LGDT,LLDT,LIDT和HLT等;(2)只有當前特權級(CPL)≤I/O特權級(IOPL)時,才能執(zhí)行I/O敏感指令,包括IN,INS,OUT,OUTS,CLI和STI。96 (1)采用INVOKE:invoke Func, param1, param2, param3(2)采用CALL:push param3 push param2 push param1 call Func97 Win32下的應用程序設計要點:(1)Win32程序運行在32位保護模式下,采用平展(Flat)內存模型,使用32位線性地址,沒有分段的概念,一般不需要使用段寄存器;(2)應用程序運行在特權級3,不能使用特權指令,必須經過操作系統(tǒng)的門機制,才能進入核心級;(3)應用程序需要調用大量的Win32 API函數;(4)Win32 API函數的返回值(如果有)在寄存器EAX中,且采用STDCALL調用約定,即通過堆棧傳遞參數,參數的傳遞順序是從右到左,并由函數本身調整堆棧指針。第10章101 __cdecl調用約定在函數名前自動加一個下劃線,從右到左將實在參數壓入堆棧,由函數的調用者進行堆棧的平衡。__stdcall調用約定從右到左將實在參數壓入堆棧,由函數本身移去調用者壓入堆棧的參數,函數名在編譯后被轉換為“_函數名@參數長度”的形式,其中,參數長度是指參數表的字節(jié)數(用十進制表示)。102 由于每個模塊要單獨編譯或匯編,因此在連接之前,每個模塊都不知道其他模塊的任何信息。如果不指出模塊中要使用的外部函數的參數個數、類型和返回值類型以及外部變量類型,編譯器或匯編器就無法對外部函數或變量的使用進行合法性檢查。103 由于該程序的函數max采用缺省的__cdecl調用約定,由函數的調用者負責堆棧的平衡,因此,在max函數返回時不會將調用者進棧的參數(占8個字節(jié))從棧中彈出。main函數在調用max后,將堆棧指針esp的值加8,目的就是調整堆棧指針,使堆棧保持平衡。104 輸出結果是10。105(1) include define N 10int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。void main( void ){int sum。__asm { mov sum, 0 mov ecx, N lea eax, anext: mov edx, [eax] add sum, edx add eax, 4 loop next}printf(sum = %d\n, sum)。}(2) include define N 10int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。int sum(int *a, int n)。void main( void ){printf(sum = %d\n, sum(a, N))。}int sum(int *a, int n){ __asm { mov eax, 0 mov ecx, n mov edx, anext: add eax, [edx] add edx, 4 loop next}}(3)// C程序 include define N 10int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。extern C int __stdcall sum(int *a, int n)。void main( void ){printf(sum = %d\n, sum(a, N))。}。 匯編語言程序: .386 public _sum@8_TEXT segment para public 39。code39。 assume cs:_TEXTParam_a equ 8[ebp]Param_n equ 12[ebp]_sum@8 proc push ebp mov ebp, esp mov eax, 0 mov ecx, Param_n mov edx, Param_anext: add eax, [edx] add edx, 4 loop next pop ebp ret 8 _sum@8 endp_TEXT ends End(4) include define N 10int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。int sum(int *a, int n)。void main( void ){ int s = 0。 __asm { mov eax, N push eax lea eax, a push eax call sum add esp, 8 mov s, eax } printf(sum = %d\n, s)。}int sum(int *a, int n){ int i, s = 0。 for (i = 0。 i n。 i++) { s += a[i]。 } return s。}106EnterRegion proc mov edx, 1InUse: mov eax, 0 cmpxchg flag, edx jnz InUse retEnterRegion endp107 x = 3,4,5,6,7,8,9。108 在某個進程執(zhí)行down操作時,如果此時flag字段的值為0,value字段的值為0,該進程將會不斷地測試信號量的值而不能對其執(zhí)行減1操作,但由于該進程將flag字段的值設置為1,使得其他進程無法修改該信號量的值,從而導致所有進程都無法對該信號量進行操作。109 define M 10 // 緩沖區(qū)InBuf可以容納的數據個數 define N 10 // 緩沖區(qū)OutBuf可以容納的數據個數typedef struct {int InPtr。int OutPtr。int Data[M]。} IN_BUFFER。IN_BUFFER InBuf = {0, 0} 。typedef struct {int InPtr。int OutPtr。int Data[N]。} OUT_BUFFER。OUT_BUFFER OutBuf = {0, 0}。SEMAPHORE mutex1 = {1, 0}。 // 訪問InBuf的互斥信號量SEMAPHORE mutex2 = {1, 0}。 // 訪問OutBuf的互斥信號量SEMAPHORE avail1 = {M, 0}, used1 = {0, 0}。 // InBuf中可用、占用緩沖的資源信號量SEMAPHORE avail2 = {N, 0}, used2 = {0, 0}。 // OutBuf中可用、占用緩沖的資源信號量void Input(void){ int data。 while (1) { scanf(%d, amp。data)。 // 讀入1個整數 down(amp。avail1)。 down(amp。mutex1)。 // 將數據放入緩沖區(qū)InBuf [] = data。 = ( + 1) % M。 up(amp。mutex1)。 up(amp。used1)。 }}void Compute(void){ int a[2]。 int sum, number = 0。 while ( 1 ) { down(amp。used1)。 down(amp。mutex1)。 // 從InBuf取一個整數,放入a[number] a[number] = []。 = ( + 1) % M。 up(amp。mutex1)。 up(amp。avail1)。 if (numbe
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1