自学8086 发表于 2023-9-30 16:31:26

自学汇编遇到一些简单题不会做

8086汇编语言题目是从num存储单元开始存放两个带符号的字数据,若两数据同号则将flag寄存器清0否则置全1,家人们平时有不会题哪里还能搜搜或者能解决,这汇编题不会真的写不出来,还有哪里有好的资料吗?在这里谢过了

isdkz 发表于 2023-9-30 16:31:43

这道题目需要对8086汇编语言的基本指令和寄存器有一定的了解。以下是解题步骤:

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

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

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

下面是代码示例:

mov ax,    ; 读取第一个带符号的字数据
mov bx,    ; 读取第二个带符号的字数据

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站上的《汇编语言入门》系列视频。

陶远航 发表于 2023-9-30 16:31:58

不用担心,汇编语言的学习确实需要一些时间和经验积累,逐渐掌握它的技巧和思维方式。对于提到的这个题目,可以使用80386及以上处理器提供的条件分支指令来实现。

首先,我们需要加载两个带符号的字数据到寄存器中,比如可以用MOV AX, 来加载第一个数到AX寄存器,然后通过MOV BX, 来加载第二个数到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. 汇编语言在线教程:有一些在线资源提供了汇编语言的学习教程和实践项目,你可以通过搜索来找到合适的资源。

此外,我建议你多进行实践和练习,使用汇编语言编写一些简单的程序,加深对指令和编程思想的理解。祝你学习顺利!
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 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,       ; 读取当前数组元素的值到 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. 汇编语言在线教程:有一些在线资源提供了汇编语言的学习教程和实践项目,你可以通过搜索来找到合适的资源。

希望这个答案能够帮助到你。如果还有其他问题,请随时提出。

自学8086 发表于 2023-9-30 16:43:32

Mike_python小 发表于 2023-9-30 16:35
这个汇编语言题目可以用以下的代码来实现:




谢谢你,真的谢谢你

自学8086 发表于 2023-9-30 16:47:14

Mike_python小 发表于 2023-9-30 16:35
这个汇编语言题目可以用以下的代码来实现:




我学的是微机原理与接口技术这本书,是为了突击考研用的,要考到8253,8255等,如果从头学感觉怕来不及,而且还需要进行一些存储器设计,还有其他比较有效的资料吗?

Mike_python小 发表于 2023-9-30 16:50:40

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

对这方面不是很了解{:10_262:}可以问问@人造人 大佬

自学8086 发表于 2023-9-30 16:53:25

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

感谢感谢

陶远航 发表于 2023-9-30 16:54:02

自学8086 发表于 2023-9-30 16:53
感谢感谢

给一个最佳答案呗

Mike_python小 发表于 2023-9-30 16:54:40

自学8086 发表于 2023-9-30 13:53
感谢感谢

给个最佳被

自学8086 发表于 2023-9-30 16:54:44

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

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

test检测第一个和第二个符号位是否相同为啥是al和ah,第二个数据不是在bx里吗

Mike_python小 发表于 2023-9-30 16:55:42

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

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

正确的代码如下:

mov ax,    ; 读取第一个带符号的字数据
mov bx,    ; 读取第二个带符号的字数据

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:

希望这个回答对你有帮助。如果你还有其他问题,请随时提出。

自学8086 发表于 2023-9-30 17:07:52

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

你的代码都是自己编写的吗?,如何检验自己是否有误

Mike_python小 发表于 2023-9-30 17:09:00

自学8086 发表于 2023-9-30 14:07
你的代码都是自己编写的吗?,如何检验自己是否有误

GPT的代码

人造人 发表于 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

人造人 发表于 2023-10-2 13:18:07

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

从头学肯定来不及
所以,你如果真的希望能考过,那就背答案
不需要管什么原理
希望弄明白原理,那是这之后的事情了
页: [1]
查看完整版本: 自学汇编遇到一些简单题不会做