汇编:jmp指令

1、概念

1、jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP;
2、jmp指令要给出两种信息:

1、转移的目的地址
2、转移的距离(段间转移、段内短转移,
段内近转移)

2、8086CPU中的jmp指令

1、CPU从何处执行指令是由CS、IP中的内容决定的,我们可以通过改变CS、IP的内容来控制CPU执行目标指令。
2、8086提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如:

mov ax,10
mov bx,20
mov cx,30
mov dx,40

3、但是,mov指令不能用于设置CS、IP的值,8086没有提供这样的功能
4、8086提供了另外的指令来修改CS、IP的值,这些指令统称为转移指令,最简单的是jmp指令。

一、若想同时修改CS、IP的内容,可用形如jmp 段地址:偏移地址的指令完成,如

jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令。
jmp段地址:偏移地址指令的功能为:用指令中给出的段地址修改 CS,偏移地
址修改 IP。

二、若想仅修改 IP 的内容,可用形如jmp某一合法寄存器的指令完成,如

1、jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H;
指令执行后:ax=1000H,CS=2000H,IP=1000H
2、jmp bx,指令执行前:bx=0B16H,CS=2000H,IP-0003H;
指令执行后:bx=0B16H,CS=2000H,P=0B16H
jmp某一合法寄存器指令的功能为:用寄存器中的值修改 IP。
jmp ax,在含义上好似:mov IP,ax。

5、可以jmp 直接值来改变IP的值,比如jmp 0100H

3、问答拓展

1、内存中存放的机器码和对应的汇编指令情况如下图所示,设CPU初始状态:CS=2000H,IP=0000H,请写出指令执行序列。思考后看分析:
请添加图片描述

2、下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?

mov ax,bx
sub ax,ax
jmp
ax
  • 12
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的 x86 汇编语言实现的计算器,可以进行加、减、乘、除运算: ```assembly section .data prompt1 db "Enter the first number: ", 0 prompt2 db "Enter the second number: ", 0 prompt3 db "Result: ", 0 plus db "+", 0 minus db "-", 0 times db "*", 0 divide db "/", 0 section .bss num1 resb 5 num2 resb 5 result resb 5 section .text global _start _start: ; First number input mov eax, 4 mov ebx, 1 mov ecx, prompt1 mov edx, 20 int 0x80 mov eax, 3 mov ebx, 0 mov ecx, num1 mov edx, 5 int 0x80 ; Second number input mov eax, 4 mov ebx, 1 mov ecx, prompt2 mov edx, 23 int 0x80 mov eax, 3 mov ebx, 0 mov ecx, num2 mov edx, 5 int 0x80 ; Convert num1 and num2 to integer mov eax, num1 call atoi mov ebx, eax mov eax, num2 call atoi mov ecx, eax ; Calculate the result mov eax, ebx add eax, ecx ; or sub, mul, div mov [result], eax ; Output the result mov eax, 4 mov ebx, 1 mov ecx, prompt3 mov edx, 8 int 0x80 mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 5 int 0x80 ; Exit mov eax, 1 xor ebx, ebx int 0x80 ; atoi: Convert string to integer ; Input: EAX -> pointer to string ; Output: EAX -> integer value atoi: push ebp mov ebp, esp push ebx xor eax, eax ; Initialize result to 0 mov ebx, 10 ; Initialize base to 10 .loop: movzx ecx, byte [eax] ; Get the next character cmp ecx, 0 ; Check for end of string je .done sub ecx, '0' ; Convert to integer mul ebx ; Multiply by base add eax, ecx ; Add to result inc eax ; Increment pointer jmp .loop .done: dec eax ; Point back to last digit pop ebx mov esp, ebp pop ebp ret ``` 在这个例子中,我们使用了 x86 汇编语言的一些基本指令,例如 mov、add、sub、mul、div 等等。主要实现的流程是: 1. 提示用户输入第一个数字; 2. 读取用户输入的第一个数字; 3. 提示用户输入第二个数字; 4. 读取用户输入的第二个数字; 5. 将这两个数字转换为整数; 6. 进行加减乘除等数值运算; 7. 输出结果; 8. 退出程序。 这个程序只是一个简单的例子,实际上可以扩展为更复杂的计算器,例如支持浮点数、支持多种运算符、支持括号等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值