鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: fish111

汇编每日一练

[复制链接]
发表于 2024-11-29 22:20:53 | 显示全部楼层
fish111 发表于 2024-11-29 22:20
但是这个程序运算结果不正确呀


对于给出的程序进行修正,确保运算结果正确输出。我们将使用 `SHR` 指令小心地提取高位和低位。在某些情况下,`SHR` 可能会有兼容性问题,可以通过其他方式提取高位和低位。以下是经过修正的代码:

  1. .MODEL SMALL
  2. .STACK 100h
  3. .DATA
  4.     prompt1 DB 'Enter first hex digit (0-F): $'
  5.     prompt2 DB 'Enter second hex digit (0-F): $'
  6.     prompt3 DB 'Enter operation character (A-D): $'
  7.     result  DB 'Result: $'

  8. .CODE
  9. START:
  10.     MOV AX, @DATA
  11.     MOV DS, AX

  12.     ; 输入第一个十六进制数X
  13.     LEA DX, prompt1
  14.     MOV AH, 09H
  15.     INT 21H

  16.     MOV AH, 01H
  17.     INT 21H
  18.     SUB AL, '0'
  19.     CMP AL, 9
  20.     JBE SHORT STORE_X
  21.     SUB AL, 7  ; 用于字符 A-F
  22. STORE_X:
  23.     MOV BL, AL ; BL = X

  24.     ; 输入第二个十六进制数Y
  25.     LEA DX, prompt2
  26.     MOV AH, 09H
  27.     INT 21H

  28.     MOV AH, 01H
  29.     INT 21H
  30.     SUB AL, '0'
  31.     CMP AL, 9
  32.     JBE SHORT STORE_Y
  33.     SUB AL, 7  ; 用于字符 A-F
  34. STORE_Y:
  35.     MOV BH, AL ; BH = Y

  36.     ; 输入操作符A-D
  37.     LEA DX, prompt3
  38.     MOV AH, 09H
  39.     INT 21H

  40.     MOV AH, 01H
  41.     INT 21H
  42.     MOV CL, AL

  43.     ; 执行操作
  44.     CMP CL, 'A'
  45.     JE ADD_OPERATION
  46.     CMP CL, 'B'
  47.     JE SUB_OPERATION
  48.     CMP CL, 'C'
  49.     JE MUL_OPERATION
  50.     CMP CL, 'D'
  51.     JE DIV_OPERATION

  52.     ; 无效输入,退出程序
  53.     JMP END_PROGRAM

  54. ADD_OPERATION:
  55.     MOV AL, BL
  56.     ADD AL, BH
  57.     MOV AH, 0  ; 确保上位清零
  58.     JMP DISPLAY_RESULT

  59. SUB_OPERATION:
  60.     MOV AL, BL
  61.     SUB AL, BH
  62.     JAE POSITIVE_DIFF
  63.     NEG AL
  64. POSITIVE_DIFF:
  65.     MOV AH, 0  ; 确保上位清零
  66.     JMP DISPLAY_RESULT

  67. MUL_OPERATION:
  68.     MOV AL, BL
  69.     MUL BH
  70.     ; 结果存储在 AX 中
  71.     JMP DISPLAY_RESULT_AX

  72. DIV_OPERATION:
  73.     MOV AL, BL
  74.     XOR AH, AH
  75.     DIV BH
  76.     MOV AH, 0  ; 确保上位清零
  77.     JMP DISPLAY_RESULT

  78. DISPLAY_RESULT:
  79.     LEA DX, result
  80.     MOV AH, 09H
  81.     INT 21H

  82.     ; 显示结果
  83.     MOV AH, 02H
  84.     MOV DL, AL

  85.     ; 显示高半字节
  86.     MOV AL, DL
  87.     AND AL, 0F0h
  88.     SHR AL, 4
  89.     CALL PRINT_HEX

  90.     ; 显示低半字节
  91.     MOV AL, DL
  92.     AND AL, 0Fh
  93.     CALL PRINT_HEX

  94.     JMP END_PROGRAM

  95. DISPLAY_RESULT_AX:
  96.     LEA DX, result
  97.     MOV AH, 09H
  98.     INT 21H

  99.     ; 显示高字节(AX 的高半字节)
  100.     MOV DL, AH
  101.     AND DL, 0F0h
  102.     SHR DL, 4
  103.     CALL PRINT_HEX

  104.     ; 显示低字节(AX 的低半字节)
  105.     MOV DL, AH
  106.     AND DL, 0Fh
  107.     CALL PRINT_HEX

  108.     ; 显示低字节(AX 的低位)
  109.     MOV DL, AL
  110.     AND DL, 0F0h
  111.     SHR DL, 4
  112.     CALL PRINT_HEX

  113.     MOV DL, AL
  114.     AND DL, 0Fh
  115.     CALL PRINT_HEX

  116.     JMP END_PROGRAM

  117. PRINT_HEX:
  118.     ADD AL, '0'
  119.     CMP AL, '9'
  120.     JBE SHORT PRINT_CHAR
  121.     ADD AL, 7
  122. PRINT_CHAR:
  123.     MOV DL, AL
  124.     MOV AH, 02H
  125.     INT 21H
  126.     RET

  127. END_PROGRAM:
  128.     MOV AH, 4CH
  129.     INT 21H

  130. END START
复制代码


在这个版本中,我们仔细地将寄存器拆分为高位和低位部分来处理 `MUL` 产生的结果,并在需要的地方正确显示结果。请将这段代码拷贝到您的汇编环境中进行编译和测试。希望这可以解决您所遇到的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-6 11:48:50 | 显示全部楼层
本帖最后由 人造人 于 2024-12-6 11:51 编辑
  1. sh-5.2$ ls
  2. main.s        Makefile
  3. sh-5.2$ cat Makefile
  4. LINK.o       = $(LD) $(LDFLAGS)
  5. ASFLAGS     := -g
  6. LDFLAGS     := -dynamic-linker /lib64/ld-linux-x86-64.so.2

  7. all: main

  8. main: main.o

  9. clean:
  10.         $(RM) main main.o
  11. sh-5.2$ cat main.s
  12.     .section    .text
  13. input_num:
  14.     subq    $8, %rsp

  15.     # sys_read
  16.     movq    $0, %rax
  17.     movq    $0, %rdi
  18.     movq    %rsp, %rsi
  19.     movq    $8, %rdx
  20.     syscall

  21.     movzbq  (%rsp), %rax
  22.     movq    %rax, %rdi
  23.     movq    %rax, %rsi
  24.     subq    $'0', %rax
  25.     subq    $'a', %rdi
  26.     addq    $10, %rdi
  27.     cmpq    $'a', %rsi
  28.     cmovnbq %rdi, %rax

  29.     addq    $8, %rsp
  30.     retq

  31. output_num:
  32.     subq    $8, %rsp

  33.     movq    %rax, %rdi
  34.     movq    %rax, %rsi
  35.     addq    $'0', %rax
  36.     addq    $'a', %rdi
  37.     subq    $10, %rdi
  38.     cmpq    $10, %rsi
  39.     cmovnbq %rdi, %rax
  40.     movb    %al, (%rsp)
  41.     movb    $'\n', 1(%rsp)

  42.     # sys_write
  43.     movq    $1, %rax
  44.     movq    $1, %rdi
  45.     movq    %rsp, %rsi
  46.     movq    $2, %rdx
  47.     syscall

  48.     addq    $8, %rsp
  49.     retq

  50.     .global     _start
  51. _start:
  52.     callq   input_num
  53.     movq    %rax, %r12
  54.     callq   input_num
  55.     movq    %rax, %r13
  56.     callq   input_num
  57.     movq    %rax, %r8

  58.     movq    %r12, %rax
  59.     xorq    %rdx, %rdx
  60.     divq    %r13
  61.     movq    %rax, %rdi

  62.     movq    %r12, %rax
  63.     mulq    %r13
  64.     movq    %rax, %rsi

  65.     movq    %r12, %rdx
  66.     subq    %r13, %rdx
  67.     movq    %rdx, %rax
  68.     negq    %rax
  69.     movq    $0x8000000000000000, %rcx
  70.     testq   %rcx, %rdx
  71.     cmovnzq %rax, %rdx

  72.     movq    %r12, %rax
  73.     addq    %r13, %rax

  74.     cmpq    $11, %r8
  75.     cmoveq  %rdx, %rax
  76.     cmpq    $12, %r8
  77.     cmoveq  %rsi, %rax
  78.     cmpq    $13, %r8
  79.     cmoveq  %rdi, %rax

  80.     callq   output_num

  81.     # sys_exit
  82. 0:  movq    $60, %rax
  83.     xorq    %rdi, %rdi
  84.     syscall
  85.     jmp     0b
  86. sh-5.2$ make
  87. as -g  -o main.o main.s
  88. ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 main.o   -o main
  89. sh-5.2$ ls
  90. main  main.o  main.s  Makefile
  91. sh-5.2$ ./main
  92. 5
  93. 6
  94. a
  95. b
  96. sh-5.2$ ./main
  97. b
  98. 3
  99. b
  100. 8
  101. sh-5.2$ ./main
  102. 3
  103. b
  104. b
  105. 8
  106. sh-5.2$ ./main
  107. 5
  108. c
  109. b
  110. 7
  111. sh-5.2$ ./main
  112. 3
  113. 4
  114. c
  115. c
  116. sh-5.2$ ./main
  117. c
  118. 5
  119. d
  120. 2
  121. sh-5.2$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 21:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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