RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1280784
Accepted
Rikitikitavi
Rikitikitavi
Asked:2022-05-12 00:24:50 +0000 UTC2022-05-12 00:24:50 +0000 UTC 2022-05-12 00:24:50 +0000 UTC

在汇编程序中添加数字

  • 772

有一个程序读取两个数字,将它们相加并打印结果:

    SYS_EXIT equ 1
    SYS_READ equ 3
    SYS_WRITE equ 4
    STDIN equ 0
    STDOUT equ 1
    
    

section .text
    global _start

_start:
    mov edx, len1
    mov ecx, msg1
    mov ebx, STDOUT
    mov eax, SYS_WRITE
    int 0x80

    mov ecx, numX
    mov edx, 2
    mov ebx, STDIN
    mov eax, SYS_READ
    int 0x80
    

    mov edx, len2
    mov ecx, msg2
    mov ebx, STDOUT
    mov eax, SYS_WRITE
    int 0x80

    mov ecx, numY
    mov edx, 2
    mov ebx, STDIN
    mov eax, SYS_READ
    int 0x80

    mov eax, [numX]
    sub eax, '0'

    mov ebx, [numY]
    sub ebx, '0'

    add eax, ebx
    add eax, '0'

    mov [res], eax

    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, res
    mov edx, 2
    int 0x80

    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, msg4
    mov edx, len4
    int 0x80

    
    mov eax,SYS_EXIT
    int 0x80

section .data
    msg1 db 'X=',
    len1 equ $-msg1
    msg2 db 'Y=',
    len2 equ $-msg2
    msg3 db 'X+Y='
    len3 equ $-msg3
    msg4 db 0xA, 0xB
    len4 equ 2


segment .bss
    numX resb 2
    numY resb 2
    res resb 1

这是它显示的内容objdump -D

app:     file format elf32-i386


Disassembly of section .text:

08049000 <.text>:
 8049000:   ba 02 00 00 00          mov    $0x2,%edx
 8049005:   b9 00 a0 04 08          mov    $0x804a000,%ecx
 804900a:   bb 01 00 00 00          mov    $0x1,%ebx
 804900f:   b8 04 00 00 00          mov    $0x4,%eax
 8049014:   cd 80                   int    $0x80
 8049016:   b9 0c a0 04 08          mov    $0x804a00c,%ecx
 804901b:   ba 02 00 00 00          mov    $0x2,%edx
 8049020:   bb 00 00 00 00          mov    $0x0,%ebx
 8049025:   b8 03 00 00 00          mov    $0x3,%eax
 804902a:   cd 80                   int    $0x80
 804902c:   ba 02 00 00 00          mov    $0x2,%edx
 8049031:   b9 02 a0 04 08          mov    $0x804a002,%ecx
 8049036:   bb 01 00 00 00          mov    $0x1,%ebx
 804903b:   b8 04 00 00 00          mov    $0x4,%eax
 8049040:   cd 80                   int    $0x80
 8049042:   b9 0e a0 04 08          mov    $0x804a00e,%ecx
 8049047:   ba 02 00 00 00          mov    $0x2,%edx
 804904c:   bb 00 00 00 00          mov    $0x0,%ebx
 8049051:   b8 03 00 00 00          mov    $0x3,%eax
 8049056:   cd 80                   int    $0x80
 8049058:   a1 0c a0 04 08          mov    0x804a00c,%eax
 804905d:   83 e8 30                sub    $0x30,%eax
 8049060:   8b 1d 0e a0 04 08       mov    0x804a00e,%ebx
 8049066:   83 eb 30                sub    $0x30,%ebx
 8049069:   01 d8                   add    %ebx,%eax
 804906b:   83 c0 30                add    $0x30,%eax
 804906e:   a3 10 a0 04 08          mov    %eax,0x804a010
 8049073:   b8 04 00 00 00          mov    $0x4,%eax
 8049078:   bb 01 00 00 00          mov    $0x1,%ebx
 804907d:   b9 10 a0 04 08          mov    $0x804a010,%ecx
 8049082:   ba 01 00 00 00          mov    $0x1,%edx
 8049087:   cd 80                   int    $0x80
 8049089:   b8 04 00 00 00          mov    $0x4,%eax
 804908e:   bb 01 00 00 00          mov    $0x1,%ebx
 8049093:   b9 08 a0 04 08          mov    $0x804a008,%ecx
 8049098:   ba 02 00 00 00          mov    $0x2,%edx
 804909d:   cd 80                   int    $0x80
 804909f:   b8 01 00 00 00          mov    $0x1,%eax
 80490a4:   cd 80                   int    $0x80

Disassembly of section .data:

0804a000 <.data>:
 804a000:   58                      pop    %eax
 804a001:   3d 59 3d 58 2b          cmp    $0x2b583d59,%eax
 804a006:   59                      pop    %ecx
 804a007:   3d                      .byte 0x3d
 804a008:   0a 0b                   or     (%ebx),%cl

Disassembly of section .bss:

0804a00c <.bss>:
    ...

这是调试器显示的内容:

(gdb) run
Starting program: /home/rikitikitavi/projects/asm/app 
X=5
Y=5

Breakpoint 1, 0x08049058 in ?? ()
(gdb) c
Continuing.

Breakpoint 2, 0x08049069 in ?? ()
(gdb) info registers
eax            0xa350a05           171248133
ecx            0x804a00e           134520846
edx            0x2                 2
ebx            0xa05               2565
esp            0xffffd140          0xffffd140
ebp            0x0                 0x0
esi            0x0                 0
edi            0x0                 0
eip            0x8049069           0x8049069
eflags         0x206               [ PF IF ]
cs             0x23                35
ss             0x2b                43
ds             0x2b                43
es             0x2b                43
fs             0x0                 0
gs             0x0                 0
(gdb) si
0x0804906b in ?? ()
(gdb) info registers
eax            0xa35140a           171250698
ecx            0x804a00e           134520846
edx            0x2                 2
ebx            0xa05               2565
esp            0xffffd140          0xffffd140
ebp            0x0                 0x0
esi            0x0                 0
edi            0x0                 0
eip            0x804906b           0x804906b
eflags         0x206               [ PF IF ]
cs             0x23                35
ss             0x2b                43
ds             0x2b                43
es             0x2b                43
fs             0x0                 0
gs             0x0                 0


从objdump地址可以看出0x08049069,有一个加法命令—— add %ebx,%eax。在执行此命令之前,寄存器中应该有必要的数字 5 和 5 eax,ebx相反,我分别看到了0xa350a05和0xa05。05最后,可以说,暗示寄存器包含我需要的东西,但其余的呢?- 我理解正确,05这是寄存器的内容,al其余bl的是垃圾?那么他是从哪里来的呢?

然后我将代码添加0到结果中,将其写入内存并输出。如果您输入4并且当您输入时,5那么一切正常:

rikitikitavi@rikitikitavi:~/projects/asm$ ./app 
X=4
Y=5
9

但如果你进入5然后5一切都打破了:

rikitikitavi@rikitikitavi:~/projects/asm$ ./app 
X=5
Y=5
:

我什至理解它为什么会中断 - 因为第二个数字出现在十进制系统中并且添加代码0并不完全正确(尽管结果,原则上,在 acsii 表:之后立即是正确的)。9我需要以某种方式将结果显示给我的朋友,但我不明白如何?

现在简短的问题:

  1. 为什么我在调试器中看到一些奇怪的寄存器值?
  2. 如何更改结果输出?
ассемблер
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    PRODIGY
    2022-05-12T19:31:40Z2022-05-12T19:31:40Z
    1. 您正在将一个字节复制到一个 4 字节的寄存器EAX中(其中包含垃圾)。您必须在复制之前直接清除寄存器,或者使用如下指令进行复制movzx:
        movzx  eax,[numX]     ;// zero + mov
        sub    eax,'0'
    
        movzx  ebx,[numY]
        sub    ebx,'0'
    
        add    eax,ebx
        add    eax,'0'
    
        mov   [res],eax
    
    1. 要显示 2 位或更多位数字,您需要将数字除以 10 并添加余数。在这种情况下,数字的每个数字都会单独显示。有一些特殊的程序,但在下面的示例中,它是针对 DOS 的,而不是针对 Linux 的。在 dosINT-29h中,将 AL 输出到控制台 - 将其替换为 Linux 的适当输出。该程序是通用的,可以输出各种数字系统,从 BIN 及更高版本:
    ;// Универсальная процедура вывода чисел на консоль.
    ;// на входе: EAX = число, EBX = система счисления для вывода (2,8,10,16).
    ;// на выходе: число в строковом виде 
    ;//------------------------------------
    Hex2Asc:
        xor    ecx,ecx      ;// ECX =0, будет счётчиком разрядов числа
    @isDiv:
        xor    edx,edx      ;// подготовка к делению
        div    ebx          ;// разделить EAX на систему счисления
        push   edx          ;// запомнить остаток
        inc    ecx          ;// считаем кол-во разрядов
        or      eax,eax      ;// повторить, 
        jnz    @isDiv       ;//  ..пока EAX не станет нуль.
    @isOut:
        pop    eax          ;// берём очередной разряд из стека
        cmp    al,9         ;// проверить на DEC
        jle    @noHex       ;// если меньше/равно - значит не HEX
        add    al,7         ;// иначе: преобразовать в A-F
    @noHex:
        add    al,'0'       ;// число --> символ
        int    29h          ;// вывод очередного разряда на консоль!
        loop   @isOut       ;// промотать ECX-раз..
    ret
    
    • 2

相关问题

  • 难以在大会中创建 (for) 语句

  • call 如何使用堆栈?

  • STM32 中的中断/异常向量,汇编器

  • 寄存器和数据大小

  • 请帮助 turbo pascal 程序中的汇编程序

  • 举例说明将字符串输出到屏幕的过程 [关闭]

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5