天天看點

Intel彙編語言程式設計第四章答案

4.1

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.code
main proc
    ; CF = 1
    mov al, 0FFh
    add al, 1
    call DumpRegs
    ; CF = 0
    sub al, 0
    call DumpRegs

    exit
main endp
end main
           

4.2

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.code
main proc
    ; CF == 0
    xor eax, eax 
    mov al, 0FFh
    call DumpRegs
    ; CF == 1
    add al, 1
    call DumpRegs
    ; CF == 0
    xor eax, eax 
    mov al, 0FFh
    call DumpRegs
    ; CF == 0
    inc al
    call DumpRegs

    exit
main endp
end main
           

4.3

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.code
main proc
    ; 讓al溢出變成0, 此時ZF=1, CF=1
    mov al, 0FFh
    add al, 1
    call DumpRegs
    ; 給al加1, 不溢出不為0是以ZF=0, CF=0
    add al, 1
    call DumpRegs

    exit
main endp
end main
           

4.4

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.code
main proc
    ; 加法設定OF
    mov al, +127
    add al, 1
    call DumpRegs
    ; 減法清除OF
    sub al, 0
    call DumpRegs

    exit
main endp
end main
           

4.5

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.data 
Uarray WORD 1000h, 2000h, 3000h, 4000h
Sarray SWORD -1, -2, -3, -4

.code
main proc
    movzx eax, WORD PTR [Uarray]
    movzx ebx, WORD PTR [Uarray + 2]
    movzx ecx, WORD PTR [Uarray + 4]
    movzx edx, WORD PTR [Uarray + 6]
    call DumpRegs
    movsx eax, WORD PTR [Sarray]
    movsx ebx, WORD PTR [Sarray + 2]
    movsx ecx, WORD PTR [Sarray + 4]
    movsx edx, WORD PTR [Sarray + 6]
    call DumpRegs

    exit
main endp
end main
           

4.6

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.data 
f0 DWORD 0

.code
main proc
    mov ecx, 12 
    mov eax, 1
L1:
    call DumpRegs 
    mov ebx, f0 
    mov f0, eax
    add eax, ebx
    loop L1 

    exit
main endp
end main
           

4.7

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.data 
val1 SWORD 8 
val2 SWORD -15
val3 SWORD 20

.code
main proc
    xor eax, eax ; 0x0
    neg val2     ; 0x0
    mov ax, val2 ; 0xF
    add ax, 7    ; 0x16
    sub ax, val3 ; 0x2
    add ax, val1 ; 0xA
    call DumpRegs

    exit
main endp
end main
           

4.8

include Irvine32.inc
includelib Irvine32.lib
includelib Kernel32.Lib
includelib User32.lib

.data 
; 源字元
source BYTE "This is the source string", 0
; 源字元串長度
source_length DWORD SIZEOF source - 1
; 目的字元串
target BYTE SIZEOF source DUP('#')
; 目的字元串長度
target_length DWORD SIZEOF target - 1

.code
main proc
    ; 先把空字元指派過去
    mov ecx, target_length
    mov BYTE PTR [target + ecx], 0
    
    xor eax, eax 
    xor esi, esi 
    ; 擷取dst緩沖區大小(除了空字元)
    mov edi, target_length
    dec edi
L1:
    ; 擷取src的一個字元
    mov al, [source + esi]
    ; 把src的字元指派到dst末尾
    mov [target + edi], al
    inc esi 
    dec edi
    loop L1 
    
    ; 顯示字元串
    mov esi, OFFSET target 
    mov ebx, 1
    mov ecx, SIZEOF target 
    call DumpMem
    exit
main endp
end main
           

(完)

繼續閱讀