CSAPP BOMB LAB part3

CSAPP BOMB LAB part3

phase_4

bomb.s phase_4的代码:
CSAPP BOMB LAB part3_第1张图片
格式:
CSAPP BOMB LAB part3_第2张图片
40102e行,比较0x8+rsp的值和0xe, 需要让0x8+rsp小于0xe, 然后跳转到40103a,
CSAPP BOMB LAB part3_第3张图片
func函数根据bomb.s 转化为c代码:
CSAPP BOMB LAB part3_第4张图片
这个直接参考了知乎网友的翻译,
CSAPP BOMB LAB part3_第5张图片
func4的返回值等于0, 跳转到40105d。

汇编语法

jne指令

jne指令是x86汇编语言中的一条条件跳转指令,用于在不相等的情况下进行跳转。

jne指令的语法如下:

jne label

其中,label是一个标签,用于指定跳转的目标位置。

jne指令根据条件码寄存器的值来进行跳转。如果ZF为0,则跳转到label指定的位置。条件码寄存器的ZF位表示零标志位,当上一条指令的结果为零时,ZF被设置为1,否则为0。

下面是一个示例,展示了jne指令的使用:

section .data
    var1 dw 10
    var2 dw 20

section .text
    global _start

_start:
    mov ax, [var1]
    mov bx, [var2]

    cmp ax, bx
    jne not_equal

    ; 如果var1等于var2,则继续执行下面的指令
    ; ...

not_equal:
    ; 如果var1不等于var2,则跳转到not_equal标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

end:
    ; 结束程序
    mov eax, 1
    int 0x80

在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

然后,我们使用cmp指令比较var1var2的值。根据比较结果,jne指令会根据ZF位的值来决定是否跳转。如果var1不等于var2,即ZF为0,则跳转到not_equal标签处执行相应的代码块;如果var1等于var2,即ZF为1,则继续执行下面的指令。

最后,我们使用系统调用int 0x80来结束程序。

通过使用jne指令,我们可以根据比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。

cmpl 指令

cmpl指令是x86汇编语言中的一条比较指令,用于比较两个操作数的值。

cmpl指令的语法如下:

cmpl source, destination

其中,sourcedestination是要比较的操作数。

cmpl指令会将sourcedestination进行比较,并根据比较结果设置条件码寄存器的值。根据比较结果,条件码寄存器的ZF(零标志位)和SF(符号标志位)位会被更新。

下面是一个示例,展示了cmpl指令的使用:

section .data
    var1 dw 10
    var2 dw 20

section .text
    global _start

_start:
    mov ax, [var1]
    mov bx, [var2]

    cmpl ax, bx

    ; 根据比较结果设置的条件码寄存器的值,执行不同的跳转指令
    je equal
    jg greater
    jl less

    ; 继续执行下面的指令
    ; ...

equal:
    ; 如果var1等于var2,则跳转到equal标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

greater:
    ; 如果var1大于var2,则跳转到greater标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

less:
    ; 如果var1小于var2,则跳转到less标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

end:
    ; 结束程序
    mov eax, 1
    int 0x80

在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

然后,我们使用mov指令将var1var2的值分别加载到寄存器axbx中。

接下来,我们使用cmpl指令比较axbx的值。根据比较结果,条件码寄存器的ZFSF位会被更新。

根据条件码寄存器的值,我们可以使用条件跳转指令(如jejgjl等)来根据比较结果执行不同的代码逻辑分支。

通过使用cmpl指令,我们可以比较两个操作数的值,并根据比较结果来进行条件判断和跳转。

jbe指令

jbe指令是x86汇编语言中的一条条件跳转指令,用于在无符号数小于或等于的情况下进行跳转。

jbe指令的语法如下:

jbe label

其中,label是一个标签,用于指定跳转的目标位置。

jbe指令根据条件码寄存器的值来进行跳转。如果CF为1或者ZF为1,则跳转到label指定的位置。条件码寄存器的CF位表示进位标志位,当无符号数比较时,如果发生了进位,则CF被设置为1。ZF位表示零标志位,当上一条指令的结果为零时,ZF被设置为1。

下面是一个示例,展示了jbe指令的使用:

section .data
    var1 dw 10
    var2 dw 20

section .text
    global _start

_start:
    mov ax, [var1]
    mov bx, [var2]

    cmp ax, bx
    jbe less_or_equal

    ; 如果var1大于var2,则继续执行下面的指令
    ; ...

less_or_equal:
    ; 如果var1小于或等于var2,则跳转到less_or_equal标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

end:
    ; 结束程序
    mov eax, 1
    int 0x80

在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

然后,我们使用cmp指令比较var1var2的值。根据比较结果,jbe指令会根据CFZF位的值来决定是否跳转。如果var1小于或等于var2,即CF为1或者ZF为1,则跳转到less_or_equal标签处执行相应的代码块;如果var1大于var2,即CF为0且ZF为0,则继续执行下面的指令。

最后,我们使用系统调用int 0x80来结束程序。

通过使用jbe指令,我们可以根据无符号数的比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。

cmpq 指令

CSAPP BOMB LAB part3_第6张图片

jx 指令

CSAPP BOMB LAB part3_第7张图片

shr指令

SHR 是汇编语言中的一个指令,用于将一个数值向右移动指定的位数。SHR 是 “Shift Right” 的缩写。它是一种逻辑右移指令,表示将操作数的二进制位向右移动,并用零填充左侧空出的位。

SHR 指令的语法和操作数取决于所使用的汇编语言和体系结构。下面是一个通用的示例:

SHR destination, count
  • destination:目标操作数,表示要进行右移操作的值。可以是寄存器、内存位置或立即数。
  • count:右移的位数。可以是一个立即数或者由寄存器或内存位置提供的数值。

SHR 指令将目标操作数的二进制位向右移动指定的位数。移动后,右侧的位将被丢弃,左侧空出的位将用零填充。移动的位数由 count 指定。

以下是一个示例,展示了如何使用 SHR 指令将寄存器 AL 的值向右移动 1 位:

MOV AL, 0b11001100 ; AL = 0xCC
SHR AL, 1         ; 将 AL 的值向右移动 1 位

; 移动后,AL = 0x66

在上述示例中,AL 寄存器的初始值为 0xCC,即二进制 11001100。通过执行 SHR AL, 1 指令,将 AL 的值向右移动 1 位。移动后,AL 的值变为 0x66,即二进制 01100110

SHR 指令在汇编语言中常用于对数据进行位操作,例如将无符号整数除以 2 的幂次方、提取二进制数的低位等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理。

sar指令

SAR 是汇编语言中的一个指令,用于将一个数值向右算术移动指定的位数。SAR 是 “Shift Arithmetic Right” 的缩写。它是一种算术右移指令,表示将操作数的二进制位向右移动,并根据符号位进行填充。

SAR 指令的语法和操作数取决于所使用的汇编语言和体系结构。下面是一个通用的示例:

SAR destination, count
  • destination:目标操作数,表示要进行右移操作的值。可以是寄存器、内存位置或立即数。
  • count:右移的位数。可以是一个立即数或者由寄存器或内存位置提供的数值。

SAR 指令将目标操作数的二进制位向右移动指定的位数,并根据符号位进行填充。移动后,右侧的位将被丢弃,左侧空出的位将用符号位进行填充。

以下是一个示例,展示了如何使用 SAR 指令将寄存器 AL 的值向右移动 1 位:

MOV AL, 0b11001100 ; AL = 0xCC
SAR AL, 1         ; 将 AL 的值向右移动 1 位

; 移动后,AL = 0xE6

在上述示例中,AL 寄存器的初始值为 0xCC,即二进制 11001100。通过执行 SAR AL, 1 指令,将 AL 的值向右移动 1 位。移动后,AL 的值变为 0xE6,即二进制 11100110

SAR 指令在汇编语言中常用于对带符号整数进行位操作,例如将带符号整数除以 2 的幂次方、进行有符号数的扩展等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理

test指令

CSAPP BOMB LAB part3_第8张图片

参考链接

https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/06-machine-control.pdf
https://zhuanlan.zhihu.com/p/106316877

你可能感兴趣的:(C++,笔试,面试题,c++,汇编)