鱼C论坛

 找回密码
 立即注册
查看: 802|回复: 15

[已解决]自学汇编遇到一些简单题不会做

[复制链接]
发表于 2023-9-30 16:31:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
8086汇编语言题目是从num存储单元开始存放两个带符号的字数据,若两数据同号则将flag寄存器清0否则置全1,家人们平时有不会题哪里还能搜搜或者能解决,这汇编题不会真的写不出来,还有哪里有好的资料吗?在这里谢过了
最佳答案
2023-9-30 16:35:13
这个汇编语言题目可以用以下的代码来实现:

.MODEL SMALL
.STACK 100h
.DATA
    num DW -1234h, -5678h    ; 定义存放两个带符号的字数据的num数组
    flag DW ?
.CODE
MAIN PROC
    MOV AX, @DATA           ; 初始化数据段寄存器
    MOV DS, AX

    MOV BX, OFFSET num      ; 将 BX 寄存器指向 num 数组
    MOV CX, 2               ; 数组中有 2 个元素
    MOV DX, 0               ; 清空 DX 寄存器

    L1:
        MOV AX, [BX]        ; 读取当前数组元素的值到 AX 中
        AND AX, 8000h       ; 判断该元素是否为负数(通过检查符号位实现)
        JZ SAME_SIGN        ; 如果是正数,跳转到 SAME_SIGN 标签
        OR DX, 0001h        ; 否则将 DX 寄存器的最低位设为 1
        JMP END_L1          ; 跳转到 END_L1 标签
    SAME_SIGN:
        AND DX, 1110b       ; 将 DX 寄存器中的最低位置为 0
        MOV BX, BX+2        ; 将 BX 寄存器移动到下一个数组元素的位置
        LOOP L1             ; 继续循环处理数组中的下一个元素
    END_L1:

    MOV flag, DX            ; 将 DX 寄存器的结果保存到 flag 变量中
    MOV AH, 4Ch            ; 设置退出程序的中断号
    INT 21h                ; 调用 DOS 系统中断,返回操作系统
MAIN ENDP
END MAIN

上面的代码定义了包含两个带符号字数据的 num 数组,使用循环检查这两个数据是否同号(即符号位是否相同),如果相同则将 flag 寄存器置为 0,否则将其置为 1。

关于书籍,我推荐你阅读这些:
1. 《汇编语言(王爽版)》:这本书是经典的汇编语言教材,适合入门学习,并且给出了大量例子和习题。

2. x86 汇编语言入门教程:这是一系列网络教程,从基础概念开始,逐步介绍x86汇编语言的各个方面。

3. NASM官方文档:如果你使用的是NASM汇编器,可以参考官方文档,里面有详细的指令说明和示例。

4. 汇编语言在线教程:有一些在线资源提供了汇编语言的学习教程和实践项目,你可以通过搜索来找到合适的资源。

希望这个答案能够帮助到你。如果还有其他问题,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-30 16:31:43 | 显示全部楼层
这道题目需要对8086汇编语言的基本指令和寄存器有一定的了解。以下是解题步骤:

1. 首先需要读取num存储单元中的两个带符号的字数据,可以使用指令mov来完成。

2. 接下来需要判断两个数据是否同号。同号的条件是两个数据的符号位相同,可以使用指令test来检测符号位是否相同。

3. 如果两个数据同号,则将flag寄存器清0,否则将flag寄存器置全1。可以使用指令jz和jmp来实现。

下面是代码示例:
mov ax, [num]     ; 读取第一个带符号的字数据
mov bx, [num+2]   ; 读取第二个带符号的字数据

test al, ah       ; 检测第一个数据的符号位和第二个数据的符号位是否相同
jz same_sign      ; 如果相同则跳转到same_sign标签
jmp diff_sign     ; 否则跳转到diff_sign标签

same_sign:
    xor ah, ah    ; 将flag寄存器清0
    jmp end       ; 跳转到end标签

diff_sign:
    mov ah, 0FFh  ; 将flag寄存器置全1

end:

关于自学汇编的资料,可以参考《汇编语言(第3版)》一书,该书详细介绍了8086汇编语言的基本知识和应用。此外,还可以参考一些在线教程和视频教程,如B站上的《汇编语言入门》系列视频。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:31:58 | 显示全部楼层
不用担心,汇编语言的学习确实需要一些时间和经验积累,逐渐掌握它的技巧和思维方式。对于提到的这个题目,可以使用80386及以上处理器提供的条件分支指令来实现。

首先,我们需要加载两个带符号的字数据到寄存器中,比如可以用MOV AX, [num]来加载第一个数到AX寄存器,然后通过MOV BX, [num+2]来加载第二个数到BX寄存器。注意这里假设num是存放数据的内存单元地址。

接下来,我们可以使用IMUL指令将AX寄存器和BX寄存器相乘,并将结果保存在DX:AX寄存器对中。然后,我们可以使用TEST指令来检查DX寄存器中的高16位是否为0,如果是零,则说明两个数的符号相同,将Flag寄存器清零(CLC),否则将Flag寄存器置1(STC)。

最后,你可以根据Flag寄存器的值进行相应的处理,如输出信息等。

关于汇编语言的学习资料,以下是一些常用的资源:

1. 《汇编语言(王爽版)》:这本书是经典的汇编语言教材,适合入门学习,并且给出了大量例子和习题。

2. x86 汇编语言入门教程:这是一系列网络教程,从基础概念开始,逐步介绍x86汇编语言的各个方面。

3. NASM官方文档:如果你使用的是NASM汇编器,可以参考官方文档,里面有详细的指令说明和示例。

4. 汇编语言在线教程:有一些在线资源提供了汇编语言的学习教程和实践项目,你可以通过搜索来找到合适的资源。

此外,我建议你多进行实践和练习,使用汇编语言编写一些简单的程序,加深对指令和编程思想的理解。祝你学习顺利!
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:35:13 | 显示全部楼层    本楼为最佳答案   
这个汇编语言题目可以用以下的代码来实现:

.MODEL SMALL
.STACK 100h
.DATA
    num DW -1234h, -5678h    ; 定义存放两个带符号的字数据的num数组
    flag DW ?
.CODE
MAIN PROC
    MOV AX, @DATA           ; 初始化数据段寄存器
    MOV DS, AX

    MOV BX, OFFSET num      ; 将 BX 寄存器指向 num 数组
    MOV CX, 2               ; 数组中有 2 个元素
    MOV DX, 0               ; 清空 DX 寄存器

    L1:
        MOV AX, [BX]        ; 读取当前数组元素的值到 AX 中
        AND AX, 8000h       ; 判断该元素是否为负数(通过检查符号位实现)
        JZ SAME_SIGN        ; 如果是正数,跳转到 SAME_SIGN 标签
        OR DX, 0001h        ; 否则将 DX 寄存器的最低位设为 1
        JMP END_L1          ; 跳转到 END_L1 标签
    SAME_SIGN:
        AND DX, 1110b       ; 将 DX 寄存器中的最低位置为 0
        MOV BX, BX+2        ; 将 BX 寄存器移动到下一个数组元素的位置
        LOOP L1             ; 继续循环处理数组中的下一个元素
    END_L1:

    MOV flag, DX            ; 将 DX 寄存器的结果保存到 flag 变量中
    MOV AH, 4Ch            ; 设置退出程序的中断号
    INT 21h                ; 调用 DOS 系统中断,返回操作系统
MAIN ENDP
END MAIN

上面的代码定义了包含两个带符号字数据的 num 数组,使用循环检查这两个数据是否同号(即符号位是否相同),如果相同则将 flag 寄存器置为 0,否则将其置为 1。

关于书籍,我推荐你阅读这些:
1. 《汇编语言(王爽版)》:这本书是经典的汇编语言教材,适合入门学习,并且给出了大量例子和习题。

2. x86 汇编语言入门教程:这是一系列网络教程,从基础概念开始,逐步介绍x86汇编语言的各个方面。

3. NASM官方文档:如果你使用的是NASM汇编器,可以参考官方文档,里面有详细的指令说明和示例。

4. 汇编语言在线教程:有一些在线资源提供了汇编语言的学习教程和实践项目,你可以通过搜索来找到合适的资源。

希望这个答案能够帮助到你。如果还有其他问题,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 16:43:32 | 显示全部楼层
Mike_python小 发表于 2023-9-30 16:35
这个汇编语言题目可以用以下的代码来实现:

谢谢你,真的谢谢你

评分

参与人数 1荣誉 +1 收起 理由
Mike_python小 + 1 可以给一个最佳答案吗!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 16:47:14 | 显示全部楼层
Mike_python小 发表于 2023-9-30 16:35
这个汇编语言题目可以用以下的代码来实现:

我学的是微机原理与接口技术这本书,是为了突击考研用的,要考到8253,8255等,如果从头学感觉怕来不及,而且还需要进行一些存储器设计,还有其他比较有效的资料吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:50:40 | 显示全部楼层
自学8086 发表于 2023-9-30 13:47
我学的是微机原理与接口技术这本书,是为了突击考研用的,要考到8253,8255等,如果从头学感觉怕来不及, ...

对这方面不是很了解可以问问@人造人 大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 16:53:25 | 显示全部楼层
陶远航 发表于 2023-9-30 16:31
不用担心,汇编语言的学习确实需要一些时间和经验积累,逐渐掌握它的技巧和思维方式。对于提到的这个题目, ...

感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:54:02 | 显示全部楼层

给一个最佳答案呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:54:40 | 显示全部楼层

给个最佳被
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 16:54:44 | 显示全部楼层
isdkz 发表于 2023-9-30 16:31
这道题目需要对8086汇编语言的基本指令和寄存器有一定的了解。以下是解题步骤:

1. 首先需要读取num存储 ...

test检测第一个和第二个符号位是否相同为啥是al和ah,第二个数据不是在bx里吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:55:42 | 显示全部楼层
自学8086 发表于 2023-9-30 13:54
test检测第一个和第二个符号位是否相同为啥是al和ah,第二个数据不是在bx里吗

非常抱歉,我之前的回答有误。在这个代码示例中,test指令应该是检测ax寄存器的符号位。因为ax寄存器的高字节ah存储第一个数据的符号位,低字节al存储第一个数据的数值。

正确的代码如下:
mov ax, [num]     ; 读取第一个带符号的字数据
mov bx, [num+2]   ; 读取第二个带符号的字数据

test ax, bx       ; 检测第一个数据的符号位和第二个数据的符号位是否相同
jz same_sign      ; 如果相同则跳转到same_sign标签
jmp diff_sign     ; 否则跳转到diff_sign标签

same_sign:
    xor ah, ah    ; 将flag寄存器清0
    jmp end       ; 跳转到end标签

diff_sign:
    mov ah, 0FFh  ; 将flag寄存器置全1

end:

希望这个回答对你有帮助。如果你还有其他问题,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-30 17:07:52 | 显示全部楼层
Mike_python小 发表于 2023-9-30 16:55
非常抱歉,我之前的回答有误。在这个代码示例中,test指令应该是检测ax寄存器的符号位。因为ax寄存器的高 ...

你的代码都是自己编写的吗?,如何检验自己是否有误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 17:09:00 | 显示全部楼层
自学8086 发表于 2023-9-30 14:07
你的代码都是自己编写的吗?,如何检验自己是否有误

GPT的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-2 13:14:36 | 显示全部楼层
我也推荐 王爽的《汇编语言》
另外我还推荐 李忠的《x86汇编语言:从实模式到保护模式》

对于考试/比赛这类场合,我没有什么好的办法
毕竟这些知识几十年也掌握不了,你怎么能期望几年就掌握?
如果你真的想要学会这些东西,那就从头开始学这些东西,花个几十年时间
如果你还希望考试能考过的话,我也有个好办法,非常好的办法
背答案,管他什么原理,背过就能考过
不然呢?你怎么能期望需要花几十年才能掌握的知识,你在几年之内就掌握?
所以,去背答案吧,背过就能考过


这个题目我也写了一下,你可以看看
    .code16
    .globl  _start
_start:
    movw    $0x07c0, %ax
    movw    %ax, %ds

    movw    $0, flag
    movw    num, %ax
    movw    num + 2, %bx
    andw    $0x8000, %ax
    andw    $0x8000, %bx
    xorw    %ax, %bx
    je      1f
    movw    $0xffff, flag

1:  cli
    hlt
    jmp     1b

num:
    .dc.w   0x1234, 0x5678
flag:
    .dc.w   0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-2 13:18:07 | 显示全部楼层
自学8086 发表于 2023-9-30 16:47
我学的是微机原理与接口技术这本书,是为了突击考研用的,要考到8253,8255等,如果从头学感觉怕来不及, ...

从头学肯定来不及
所以,你如果真的希望能考过,那就背答案
不需要管什么原理
希望弄明白原理,那是这之后的事情了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表